【Hive】学习笔记

news2024/11/15 9:36:29

Hive学习笔记

  • 【一】Hive入门
    • 【1】什么是Hive
    • 【2】Hive的优缺点
      • (1)优点
      • (2)缺点
    • 【3】Hive架构原理
      • (1)用户接口:Client
      • (2)元数据:Metastore
      • (3)Hadoop
      • (4)驱动器:Driver
  • 【二】Hive安装
    • 【1】Hive安装
    • 【2】HiveJDBC访问
    • 【3】Hive常用交互命令
    • 【4】Hive其他命令操作
    • 【5】Hive常见属性配置
  • 【三】Hive数据类型
    • 【1】基本数据类型
    • 【2】集合数据类型
    • 【3】类型转化
  • 【四】DDL数据定义
    • 【1】创建数据库
    • 【2】查询数据库
    • 【3】删除数据库
    • 【4】创建表
      • (1)建表语法
      • (2)字段解释说明
      • (3)内部表
      • (4)外部表
      • (5)管理表与外部表的互相转换
    • 【5】分区表(partition)
      • (1)分区表基本操作
    • 【6】修改表
      • (1)重命名表
      • (2)增加/修改/替换列信息
      • (3)删除表
  • 【五】DML数据操作
    • 【1】数据导入
      • (1)向表中装载数据(Load)
      • (2)通过查询语句向表中插入数据(Insert)
      • (3)查询语句中创建表并加载数据(As Select)
      • (4)创建表时通过Location指定加载数据路径
      • (5)Import数据到指定Hive表中
    • 【2】数据导出
      • (1)Insert导出
      • (2)Hadoop命令导出到本地
      • (3)Hive Shell 命令导出
      • (4)Export导出到HDFS上
    • 【3】清除表中数据(Truncate)
  • 【六】查询
    • 【1】基本查询(Select…From)
      • (1)全表和特定列查询
      • (2)列别名
      • (3)算术运算符
      • (4)常用函数
      • (5)Limit语句
    • 【2】Where语句
      • (1)比较运算符(Between/In/ Is Null)
      • (2)Like和RLike
      • (3)逻辑运算符(And/Or/Not)
    • 【3】分组
      • (1)GroupBy分组
      • (2)Having语句
    • 【4】Join语句
      • (1)等值Join
      • (2)表的别名
      • (3)内连接
      • (4)左外连接
      • (5)右外连接
      • (6)满外连接
      • (7)笛卡尔积
      • (8)连接谓词中不支持or
    • 【5】排序
      • (1)全局排序(Order By)
      • (2)每个MapReduce内部排序(Sort By)
      • (3)分区排序(Distribute By)
      • (4)Cluster By
    • 【6】分桶(buckets)及抽样查询
      • (1)分桶表数据存储
      • (2)分桶抽样查询
    • 【7】其他常用查询函数
      • (1)空字段赋值
      • (2)CASE WHEN
      • (3)行转列
      • (4)列转行
      • (5)窗口函数
      • (6)Rank
  • 【七】函数
  • 【八】性能优化

【一】Hive入门

【1】什么是Hive

Hive:由Facebook开源用于解决海量结构化日志的数据统计。

Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL查询功能。

本质是:将HQL转化成MapReduce程序

在这里插入图片描述
(1)Hive处理的数据存储在HDFS
(2)Hive分析数据底层的实现是MapReduce
(3)执行程序运行在Yarn上

【2】Hive的优缺点

(1)优点

(1)操作接口采用类SQL语法,提供快速开发的能力(简单、容易上手)。
(2)避免了去写MapReduce,减少开发人员的学习成本。
(3)Hive的执行延迟比较高,因此Hive常用于数据分析,对实时性要求不高的场合。
(4)Hive优势在于处理大数据,对于处理小数据没有优势,因为Hive的执行延迟比较高。
(5)Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。

(2)缺点

(1)Hive的HQL表达能力有限
1-迭代式算法无法表达
2-数据挖掘方面不擅长
(2)Hive的效率比较低
1-Hive自动生成的MapReduce作业,通常情况下不够智能化
2-Hive调优比较困难,粒度较粗

【3】Hive架构原理

在这里插入图片描述

(1)用户接口:Client

CLI(hive shell)、JDBC/ODBC(java访问hive)、WEBUI(浏览器访问hive)

(2)元数据:Metastore

元数据包括:表名、表所属的数据库(默认是default)、表的拥有者、列/分区字段、表的类型(是否是外部表)、表的数据所在目录等;

默认存储在自带的derby数据库中,推荐使用MySQL存储Metastore

(3)Hadoop

使用HDFS进行存储,使用MapReduce进行计算。

(4)驱动器:Driver

(1)解析器(SQL Parser):将SQL字符串转换成抽象语法树AST,这一步一般都用第三方工具库完成,比如antlr;对AST进行语法分析,比如表是否存在、字段是否存在、SQL语义是否有误。
(2)编译器(Physical Plan):将AST编译生成逻辑执行计划。
(3)优化器(Query Optimizer):对逻辑执行计划进行优化。
(4)执行器(Execution):把逻辑执行计划转换成可以运行的物理计划。对于Hive来说,就是MR/Spark。

在这里插入图片描述
Hive通过给用户提供的一系列交互接口,接收到用户的指令(SQL),使用自己的Driver,结合元数据(MetaStore),将这些指令翻译成MapReduce,提交到Hadoop中执行,最后,将执行返回的结果输出到用户交互接口。

【二】Hive安装

【1】Hive安装

【2】HiveJDBC访问

【3】Hive常用交互命令

【4】Hive其他命令操作

【5】Hive常见属性配置

【三】Hive数据类型

【1】基本数据类型

在这里插入图片描述
红标为常用的数据类型;

对于Hive的String类型相当于数据库的varchar类型,该类型是一个可变的字符串,不过它不能声明其中最多能存储多少个字符。

【2】集合数据类型

在这里插入图片描述

【3】类型转化

可以使用CAST操作显示进行数据类型转换

例如CAST(‘1’ AS INT)将把字符串’1’ 转换成整数1;如果强制类型转换失败,如执行CAST(‘X’ AS INT),表达式返回空值 NULL。

【四】DDL数据定义

【1】创建数据库

(1)创建一个数据库,数据库在HDFS上的默认存储路径是/opt/hive/warehouse/*.db

create database hivetest;

(2)避免要创建的数据库已经存在错误,增加if not exists判断。(标准写法)

create database if not exists hivetest;

(3)创建一个数据库,指定数据库在HDFS上存放的位置

create database if not exists hivetest location 'hdfs路径';

【2】查询数据库

(1)显示数据库

show databases;

(2)过滤显示查询的数据库

show databases like 'hivetest*';

(3)查看数据库详情

desc database hivetest;

(4)切换当前数据库

use 目标数据库名称;

【3】删除数据库

(1)删除空数据库

drop database 库名;

(2)如果删除的数据库不存在,最好采用 if exists判断数据库是否存在

drop database if exists 库名;

(3)如果数据库不为空,可以采用cascade命令,强制删除

drop database 库名 cascade;

【4】创建表

(1)建表语法

CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name 
[(col_name data_type [COMMENT col_comment], ...)] 
[COMMENT table_comment] 
[PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] 
[CLUSTERED BY (col_name, col_name, ...) 
[SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS] 
[ROW FORMAT row_format] 
[STORED AS file_format] 
[LOCATION hdfs_path]

(2)字段解释说明

(1)CREATE TABLE 创建一个指定名字的表。如果相同名字的表已经存在,则抛出异常;用户可以用 IF NOT EXISTS 选项来忽略这个异常。

(2)EXTERNAL关键字可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径(LOCATION),Hive创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。

(3)COMMENT:为表和列添加注释。

(4)PARTITIONED BY创建分区表

(5)CLUSTERED BY创建分桶表

(6)SORTED BY不常用

(7)ROW FORMAT

DELIMITED [FIELDS TERMINATED BY char] [COLLECTION ITEMS TERMINATED BY char]

​ [MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char]

| SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, …)]

用户在建表的时候可以自定义SerDe或者使用自带的SerDe。如果没有指定ROW FORMAT 或者ROW FORMAT DELIMITED,将会使用自带的SerDe。在建表的时候,用户还需要为表指定列,用户在指定表的列的同时也会指定自定义的SerDe,Hive通过SerDe确定表的具体的列的数据。

SerDe是Serialize/Deserilize的简称,目的是用于序列化和反序列化。

(8)STORED AS指定存储文件类型

常用的存储文件类型:SEQUENCEFILE(二进制序列文件)、TEXTFILE(文本)、RCFILE(列式存储格式文件)

如果文件数据是纯文本,可以使用STORED AS TEXTFILE。如果数据需要压缩,使用 STORED AS SEQUENCEFILE。

(9)LOCATION :指定表在HDFS上的存储位置。

(10)LIKE允许用户复制现有的表结构,但是不复制数据。

(3)内部表

默认创建的表都是所谓的管理表,有时也被称为内部表。因为这种表,Hive会(或多或少地)控制着数据的生命周期。Hive默认情况下会将这些表的数据存储在由配置项hive.metastore.warehouse.dir(例如,/opt/hive/warehouse)所定义的目录的子目录下。 当我们删除一个管理表时,Hive也会删除这个表中数据。管理表不适合和其他工具共享数据。

(1)普通创建表

create table if not exists student2(
id int, name string
)
row format delimited fields terminated by '\t';

(2)根据查询结果创建表(查询的结果会添加到新创建的表中)

create table if not exists student3 as select id, name from student;

(3)根据已经存在的表结构创建表

create table if not exists student4 like student;

(4)查询表的类型

desc formatted student2;

(4)外部表

因为表是外部表,所以Hive并非认为其完全拥有这份数据。删除该表并不会删除掉这份数据,不过描述表的元数据信息会被删除掉。

(1)管理表和外部表的使用场景
每天将收集到的网站日志定期流入HDFS文本文件。在外部表(原始日志表)的基础上做大量的统计分析,用到的中间表、结果表使用内部表存储,数据通过SELECT+INSERT进入内部表。

(2)案例详解
分别创建employee外部表,并向表中导入数据。

Michael|Montreal,Toronto|Male,30|DB:80|Product:DeveloperLead
Will|Montreal|Male,35|Perl:85|Product:Lead,Test:Lead
Shelley|New York|Female,27|Python:80|Test:Lead,COE:Architect
Lucy|Vancouver|Female,57|Sales:89|Sales:Lead

(3)建表语句
创建员工表

create external table if not exists employee(
name string,
address array<string>,
personalInfo array<string>,
technol map<string,int>,
jobs map<string,string>)
row format delimited
fields terminated by '|'
collection items terminated by ','
map keys terminated by ':'
lines terminated by '\n';

(4)向外部表中导入数据

load data local inpath '/root/employee.txt' into table employee;

(5)查询结果

select * from employee;

(5)管理表与外部表的互相转换

(1)修改内部表student2为外部表

alter table student2 set tblproperties('EXTERNAL'='TRUE');

(2)修改外部表student2为内部表

alter table student2 set tblproperties('EXTERNAL'='FALSE');

注意:(‘EXTERNAL’=‘TRUE’)和(‘EXTERNAL’=‘FALSE’)为固定写法,区分大小写!

【5】分区表(partition)

分区表实际上就是对应一个HDFS文件系统上的独立的文件夹,该文件夹下是该分区所有的数据文件。Hive中的分区就是分目录,把一个大的数据集根据业务需要分割成小的数据集。在查询时通过WHERE子句中的表达式选择查询所需要的指定的分区,这样的查询效率会提高很多。

(1)分区表基本操作

数据

10,ACCOUNTING,NEW YORK
10,ACCOUNTING,NEW YORK
10,ACCOUNTING,NEW YORK
20,RESEARCH,DALLAS
20,RESEARCH,DALLAS
20,RESEARCH,DALLAS
30,SALES,CHICAGO
30,SALES,CHICAGO

(1)引入分区表(需要根据日期对日志进行管理)

/opt/hive/warehouse/log_partition/20170702/20170702.log
/opt/hive/warehouse/log_partition/20170703/20170703.log
/opt/hive/warehouse/log_partition/20170704/20170704.log

(2)创建分区表语法

create table dept_partition(
deptno int, dname string, loc string
)
partitioned by (month string)
row format delimited fields terminated by ',';

(3)加载数据到分区表中

load data local inpath '/opt/dept.txt' into table default.dept_partition partition(month='201707’);
load data local inpath '/opt/dept.txt' into table default.dept_partition partition(month='201708);
load data local inpath '/opt/dept.txt' into table default.dept_partition partition(month='201709);

(4)查询分区表中数据
单分区查询

select * from dept_partition where month='201709';

多分区联合查询

select * from dept_partition where month='201709'
union
select * from dept_partition where month='201708'
union
select * from dept_partition where month='201707';

注意

Hive 1.2.0之前的版本仅支持UNION ALL,其中重复的行不会被删除。
Hive 1.2.0和更高版本中,UNION的默认行为是从结果中删除重复的行。

(5)增加分区

alter table dept_partition add partition(month='201706') ;
alter table dept_partition add partition(month='201705') partition(month='201704');

(6)删除分区在这里插入代码片

alter table dept_partition drop partition (month='201704');
alter table dept_partition drop partition (month='201705'), partition (month='201706')

(7)查看分区表有多少分区

show partitions dept_partition;

(8)查看分区表结构

desc formatted dept_partition;

【6】修改表

(1)重命名表

(1)语法

ALTER TABLE table_name RENAME TO new_table_name

(2)实例

alter table dept_partition2 rename to dept_partition3;

(2)增加/修改/替换列信息

(1)语法
更新列

ALTER TABLE table_name CHANGE [COLUMN] col_old_name col_new_name column_type [COMMENT col_comment] [FIRST|AFTER column_name]

增加和替换列

ALTER TABLE table_name ADD|REPLACE COLUMNS (col_name data_type [COMMENT col_comment], ...) 

注:ADD是代表新增一字段,字段位置在所有列后面(partition列前),REPLACE则是表示替换表中所有字段。

(2)案例
添加列

alter table dept_partition add columns(deptdesc string);

更新列

alter table dept_partition change column deptdesc desc int;

替换列

alter table dept_partition replace columns(deptno string, dname string, loc string);

(3)删除表

drop table dept_partition;

注意:外部表不能简单的通过这个命令删除,这个命令只能删除外部表的元数据,没有办法删除hdfs上面的数据,如果需要将外部表彻底删除,有以下方法:

(1)方案一:转换为内部表再删除

ALTER TABLE xxx SET TBLPROPERTIES('EXTERNAL'='False');

drop table xxx;

(2)方案二:删除元数据,然后使用hdfs删除数据

【五】DML数据操作

【1】数据导入

(1)向表中装载数据(Load)

语法

hive> load data [local] inpath '路径' [overwrite] into table 表名 [partition (partcol1=val1,)];

(1)load data:表示加载数据
(2)local:表示从本地加载数据到hive表;否则从HDFS加载数据到hive表
(3)inpath:表示加载数据的路径
(4)overwrite:表示覆盖表中已有数据,否则表示追加
(5)into table:表示加载到哪张表
(6)表名:表示具体的表
(7)partition:表示上传到指定分区

(2)通过查询语句向表中插入数据(Insert)

基本插入

insert into table  student partition(month='201709') values(1,'wangwu');

insert overwrite table student partition(month='201708') select id, name from student where month='201709';

多插入

from dept_partition
              insert overwrite table dept_partition partition(month='201707')
              select deptno,dname,loc where month='201709'
              insert overwrite table dept_partition partition(month='201706')
              select deptno,dname,loc  where month='201709';

(3)查询语句中创建表并加载数据(As Select)

查询语句中创建表并加载数据(As Select)

create table if not exists student3 as select id, name from student;

(4)创建表时通过Location指定加载数据路径

创建表,并指定在hdfs上的位置

create table if not exists student5(
id int, name string)
row format delimited fields terminated by '\t'
location '/user/hive/warehouse/student5';

上传数据到hdfs上

dfs -put /opt/datas/student.txt /opt/hive/warehouse/student5;

(5)Import数据到指定Hive表中

注意:先用export导出后,再将数据导入。

import table student2 partition(month='201709') from '/opt/hive/warehouse/export/student';

【2】数据导出

(1)Insert导出

(1)将查询的结果导出到本地

insert overwrite local directory '/opt/datas' select * from dept_partition;

(2)将查询的结果格式化导出到本地

insert overwrite local directory '/opt/datas/dept1'
row format delimited
fields terminated by '|'
select * from dept_partition;

(3)将查询的结果导出到HDFS上(没有local)

insert overwrite directory '/opt/datas/dept'
row format delimited
fields terminated by '|'
select * from dept_partition;

(2)Hadoop命令导出到本地

dfs -get /opt/hive/warehouse/employee/employee.txt /opt/datas/dept2/dept.txt;

(3)Hive Shell 命令导出

基本语法:(hive -f/-e 执行语句或者脚本 > file)

hive -e 'select * from hivetest.dept_partition;' > /opt/datas/dept3/dept.txt;

注意:需要在shell窗口执行,需要库名.表名,需要本地文件夹存在。

(4)Export导出到HDFS上

export table hivetest.dept_partition to '/opt/datas/dept2';

【3】清除表中数据(Truncate)

注意:Truncate只能删除管理表,不能删除外部表中数据

truncate table student;

【六】查询

查询语句语法

[WITH CommonTableExpression (, CommonTableExpression)*]    (Note: Only available
 starting with Hive 0.13.0)
SELECT [ALL | DISTINCT] select_expr, select_expr, ...
  FROM table_reference
  [WHERE where_condition]
  [GROUP BY col_list]
  [ORDER BY col_list]
  [CLUSTER BY col_list
    | [DISTRIBUTE BY col_list] [SORT BY col_list]
  ]
 [LIMIT number]

【1】基本查询(Select…From)

(1)全表和特定列查询

select * from emp;
select empno, ename from emp;

注意:
(1)SQL 语言大小写不敏感。
(2)SQL 可以写在一行或者多行
(3)关键字不能被缩写也不能分行
(4)各子句一般要分行写。
(5)使用缩进提高语句的可读性。

(2)列别名

(1)重命名一个列
(2)便于计算
(3)紧跟列名,可以在列名和别名之间加入关键字‘AS’

select ename AS name, deptno dn from emp;

(3)算术运算符

在这里插入图片描述

(4)常用函数

1.求总数(count)
2.求最大值(max)
3.求最小值(min)
4.求总和(sum)
5.求平均值(avg)

select count(*) cnt from emp;

(5)Limit语句

典型的查询会返回多行数据。LIMIT子句用于限制返回的行数。

select * from emp limit 5;

【2】Where语句

(1)使用WHERE子句,将不满足条件的行过滤掉
(2)WHERE子句紧随FROM子句

案例:查询出薪水大于1000的所有员工

select * from emp where sal >1000;

(1)比较运算符(Between/In/ Is Null)

下面表中描述了谓词操作符,这些操作符同样可以用于JOIN…ON和HAVING语句中。
在这里插入图片描述

(2)Like和RLike

(1)使用LIKE运算选择类似的值
(2)选择条件可以包含字符或数字:
% 代表零个或多个字符(任意个字符)。
_ 代表一个字符。

(3)RLIKE子句是Hive中这个功能的一个扩展,其可以通过Java的正则表达式这个更强大的语言来指定匹配条件。
案例:

查找以2开头薪水的员工信息

select * from emp where sal LIKE '2%';

查找第二个数值为2的薪水的员工信息

select * from emp where sal LIKE '_2%';

查找薪水中含有2的员工信息

select * from emp where sal RLIKE '[2]';

(3)逻辑运算符(And/Or/Not)

在这里插入图片描述
案例:查询薪水大于1000,部门是30

select * from emp where sal>1000 and deptno=30;

【3】分组

(1)GroupBy分组

GROUP BY语句通常会和聚合函数一起使用,按照一个或者多个列队结果进行分组,然后对每个组执行聚合操作。

案例:计算emp表每个部门的平均工资

select t.deptno, avg(t.sal) avg_sal from emp t group by t.deptno;

(2)Having语句

having与where不同点

(1)where针对表中的列发挥作用,查询数据;having针对查询结果中的列发挥作用,筛选数据。
(2)where后面不能写分组函数,而having后面可以使用分组函数。
(3)having只用于group by分组统计语句。

案例:求每个部门的平均薪水大于2000的部门

hive (default)> select deptno, avg(sal) avg_sal from emp group by deptno having avg_sal > 2000;

【4】Join语句

(1)等值Join

Hive支持通常的SQL JOIN语句,但是只支持等值连接,不支持非等值连接。

select e.empno, e.ename, d.deptno, d.dname from emp e join dept d on e.deptno = d.deptno;

(2)表的别名

好处
(1)使用别名可以简化查询。
(2)使用表名前缀可以提高执行效率。

select e.empno, e.ename, d.deptno from emp e join dept d on e.deptno = d.deptno;

(3)内连接

内连接:只有进行连接的两个表中都存在与连接条件相匹配的数据才会被保留下来。

select e.empno, e.ename, d.deptno from emp e join dept d on e.deptno = d.deptno;

(4)左外连接

左外连接:JOIN操作符左边表中符合WHERE子句的所有记录将会被返回。

select e.empno, e.ename, d.deptno from emp e left join dept d on e.deptno = d.deptno;

(5)右外连接

右外连接:JOIN操作符右边表中符合WHERE子句的所有记录将会被返回。

select e.empno, e.ename, d.deptno from emp e right join dept d on e.deptno = d.deptno;

(6)满外连接

满外连接:将会返回所有表中符合WHERE语句条件的所有记录。如果任一表的指定字段没有符合条件的值的话,那么就使用NULL值替代。

 select e.empno, e.ename, d.deptno from emp e full join dept d on e.deptno = d.deptno;

(7)笛卡尔积

笛卡尔集会在下面条件下产生
(1)省略连接条件
(2)连接条件无效
(3)所有表中的所有行互相连接

(8)连接谓词中不支持or

select e.empno, e.ename, d.deptno from emp e join dept d on e.deptno = d.deptno or e.ename=d.ename;   错误的

【5】排序

(1)全局排序(Order By)

Order By:全局排序,一个Reducer

(1)使用 ORDER BY 子句排序
ASC(ascend): 升序(默认)
DESC(descend): 降序

(2)ORDER BY 子句在SELECT语句的结尾
(3)案例实操 :查询员工信息按工资升序排列

select * from emp order by sal;

(2)每个MapReduce内部排序(Sort By)

Sort By:每个Reducer内部进行排序,对全局结果集来说不是排序。丛林
(1)设置reduce个数

set mapreduce.job.reduces=3;

(2)查看设置reduce个数

set mapreduce.job.reduces;

(3)根据部门编号降序查看员工信息

select * from dept_partition sort by deptno;

对于全局结果来说并没有排序,只是对每个reduce的结果进行了排序。

(3)分区排序(Distribute By)

Distribute By:类似MR中partition,进行分区,结合sort by使用。

​注意,Hive要求DISTRIBUTE BY语句要写在SORT BY语句之前。

对于distribute by进行测试,一定要分配多reduce进行处理,否则无法看到distribute by的效果。

select *from dept_partition distribute by deptno sort by month;
insert overwrite  local directory '/opt/datas/dept3' select *from dept_partition distribute by deptno sort by month;

(4)Cluster By

当distribute by和sorts by字段相同时,可以使用cluster by方式。

cluster by除了具有distribute by的功能外还兼具sort by的功能。但是排序只能是升序排序,不能指定排序规则为ASC或者DESC。

以下两种方法等价:

select *from dept_partition distribute by deptno sort by deptno;
select *from dept_partition cluster by deptno;

注意:按照部门编号分区,不一定就是固定死的数值,可以是20号和30号部门分到一个分区里面去。

【6】分桶(buckets)及抽样查询

(1)分桶表数据存储

分区针对的是数据的存储路径;分桶针对的是数据文件。

分区提供一个隔离数据和优化查询的便利方式。不过,并非所有的数据集都可形成合理的分区,特别是之前所提到过的要确定合适的划分大小这个疑虑。
分桶是将数据集分解成更容易管理的若干部分的另一个技术。

设置分捅属性

set hive.enforce.bucketing=true;

创建分桶表

create table stu_buck(id int, name string)
clustered by(id) 
into 4 buckets
row format delimited fields terminated by '\t';

导入数据到分桶表,通过子查询的方式

insert into table stu_buck select id, name from stu;

分捅表只能通过insert插入数据,load读取数据是无效的。

(2)分桶抽样查询

对于非常大的数据集,有时用户需要使用的是一个具有代表性的查询结果而不是全部结果。Hive可以通过对表进行抽样来满足这个需求。

select * from customers_buck1 tablesample(bucket 1 out of 4 on customer_fname);

注:tablesample是抽样语句,语法:TABLESAMPLE(BUCKET x OUT OF y) 。

y必须是table总bucket数的倍数或者因子。hive根据y的大小,决定抽样的比例。例如,table总共分了4份,当y=2时,抽取(4/2=)2个bucket的数据,当y=8时,抽取(4/8=)1/2个bucket的数据。

==x表示从第几个bucket开始抽取,如果需要取多个分区,以后的分区号为当前分区号加上y。==例如,table总bucket数为4,tablesample(bucket 1 out of 2),表示总共抽取(4/2=)2个bucket的数据,抽取第1(x)个和第3(x+y)个bucket的数据。

注意:x的值必须小于等于y的值,否则

FAILED: SemanticException [Error 10061]: Numerator should not be bigger than denominator in sample clause for table stu_buck

在这里插入图片描述
表总共有:
在这里插入图片描述

分捅相当于预览了部分数据。

【7】其他常用查询函数

(1)空字段赋值

(1)函数说明
NVL:给值为NULL的数据赋值,它的格式是NVL( string1, replace_with)。它的功能是如果string1为NULL,则NVL函数返回replace_with的值,否则返回string1的值,如果两个参数都为NULL ,则返回NULL。

c表数据:
在这里插入图片描述

select c1,nvl(c2,1) from c;

在这里插入图片描述

(2)CASE WHEN

(1)数据准备
在这里插入图片描述
(2)需求
求出不同部门男女各多少人。结果如下:

A     2       1
B     1       2

(3)按需求查询数据

select dept_id,
sum(case when sex='男' then 1 else 0 end) man,
sum(case when sex='女' then 1 else 0 end) woman
from emp_sex group by dept_id;

在这里插入图片描述

(3)行转列

(1)相关函数说明
CONCAT(string A/col, string B/col…):返回输入字符串连接后的结果,支持任意个输入字符串;

CONCAT_WS(separator, str1, str2,…):它是一个特殊形式的 CONCAT()。第一个参数剩余参数间的分隔符。分隔符可以是与剩余参数一样的字符串。如果分隔符是 NULL,返回值也将为 NULL。这个函数会跳过分隔符参数后的任何 NULL 和空字符串。分隔符将被加到被连接的字符串之间;

COLLECT_SET(col):函数只接受基本数据类型,它的主要作用是将某字段的值进行去重汇总,产生array类型字段。

(2)数据准备
在这里插入图片描述
(3)需求
把星座和血型一样的人归类到一起。结果如下:

射手座,A            大海|凤姐
白羊座,A            孙悟空|猪八戒
白羊座,B            宋宋

(4)按需求查询数据

select
    t1.base,
    concat_ws('|', collect_set(t1.name)) name
from
    (select
        name,
        concat(constellation, ",", blood_type) base
    from
        person_info) t1
group by
    t1.base;

(4)列转行

(1)函数说明
EXPLODE(col):将hive一列中复杂的array或者map结构拆分成多行。

LATERAL VIEW

用法:LATERAL VIEW udtf(expression) tableAlias AS columnAlias

解释:用于和split, explode等UDTF一起使用,它能够将一列数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。

(2)数据准备
在这里插入图片描述
(3)需求
将电影分类中的数组数据展开。结果如下:

《疑犯追踪》      悬疑
《疑犯追踪》      动作
《疑犯追踪》      科幻
《疑犯追踪》      剧情
《Lie to me》   悬疑
《Lie to me》   警匪
《Lie to me》   动作
《Lie to me》   心理
《Lie to me》   剧情
《战狼2》        战争
《战狼2》        动作
《战狼2》        灾难

(4)按需求查询数据

select  movie,category_name from movie_info
 lateral view explode(category) table_tmp  as category_name;

(5)窗口函数

(1)相关函数说明

OVER():指定分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变而变化

CURRENT ROW:当前行

n PRECEDING:往前n行数据

n FOLLOWING:往后n行数据

UNBOUNDED:起点,UNBOUNDED PRECEDING 表示从前面的起点, UNBOUNDED FOLLOWING表示到后面的终点

LAG(col,n):往前第n行数据

LEAD(col,n):往后第n行数据

NTILE(n):把有序分区中的行分发到指定数据的组中,各个组有编号,编号从1开始,对于每一行,NTILE返回此行所属的组的编号。注意:n必须为int类型。

(2)数据准备:name,orderdate,cost

jack,2017-01-01,10
tony,2017-01-02,15
jack,2017-02-03,23
tony,2017-01-04,29
jack,2017-01-05,46
jack,2017-04-06,42
tony,2017-01-07,50
jack,2017-01-08,55
mart,2017-04-08,62
mart,2017-04-09,68
neil,2017-05-10,12
mart,2017-04-11,75
neil,2017-06-12,80
mart,2017-04-13,94

(3)需求
1-查询在2017年4月份购买过的顾客及总人数
2-查询顾客的购买明细及月购买总额
3-上述的场景,要将cost按照日期进行累加
4-查询顾客上次的购买时间
5-查询前20%时间的订单信息

(4)按需求查询数据
1-查询在2017年4月份购买过的顾客及总人数

select name,count(*) over () from business where substring(orderdate,1,7) = '2017-04' group by name;

2-查询顾客的购买明细及月购买总额

select name,orderdate,cost,sum(cost) over(partition by month(orderdate)) from business;

3-上述的场景,要将cost按照日期进行累加

select name,orderdate,cost, sum(cost) over() as sample1,--所有行相加 sum(cost) over(partition by name) as sample2,--按name分组,组内数据相加 sum(cost) over(partition by name order by orderdate) as sample3,--按name分组,组内数据累加 sum(cost) over(partition by name order by orderdate rows between UNBOUNDED PRECEDING and current row ) as sample4 ,--和sample3一样,由起点到当前行的聚合 sum(cost) over(partition by name order by orderdate rows between 1 PRECEDING and current row) as sample5, --当前行和前面一行做聚合 sum(cost) over(partition by name order by orderdate rows between 1 PRECEDING AND 1 FOLLOWING ) as sample6,--当前行和前边一行及后面一行 sum(cost) over(partition by name order by orderdate rows between current row and UNBOUNDED FOLLOWING ) as sample7 --当前行及后面所有行 from business;

4-查看顾客上次的购买时间

select name,orderdate,cost, lag(orderdate,1,'1900-01-01') over(partition by name order by orderdate ) as time1, lag(orderdate,2) over (partition by name order by orderdate) as time2 from business;

5-查询前20%时间的订单信息

select * from (  select name,orderdate,cost, ntile(5) over(order by orderdate) sorted  from business) twhere sorted = 1;

(6)Rank

(1)函数说明
RANK() 排序相同时会重复,总数不会变
DENSE_RANK() 排序相同时会重复,总数会减少
ROW_NUMBER() 会根据顺序计算

(2)数据准备
在这里插入图片描述
(3)需求
计算每门学科成绩排名。

(4)按需求查询数据

select name,
subject,
score,
rank() over(partition by subject order by score desc) rp,
dense_rank() over(partition by subject order by score desc) drp,
row_number() over(partition by subject order by score desc) rmp
from score;

【七】函数

【八】性能优化

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1990392.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Augmentation for small object detection

Abstract 我们对MS COCO数据集上的当前最先进模型Mask-RCNN进行了分析。我们发现小物体的ground-truth与预测的锚框之间的重叠远远低于预期的IoU阈值。我们推测这是由两个因素造成的&#xff1a;&#xff08;1&#xff09;只有少数图像包含小物体&#xff0c;&#xff08;2&am…

英特尔18A制程技术分析解读

#### 引言 尽管第二季度净亏损16亿美元以及大规模裁员计划引发了一些担忧&#xff0c;英特尔还是在8月6日宣布了其下一代18A制程技术取得重大里程碑的消息&#xff0c;并计划在2025年开始生产。 #### 技术进展 - **里程碑**&#xff1a;英特尔表示&#xff0c;这一里程碑是在…

IoTDB组件AI Node发布9个月,如何使用你了解了吗?

数据 x AI &#xff0c;第一批用户已认可&#xff01; 在工业智能化转型中&#xff0c;时序数据库与 AI 技术的结合对故障和异常预测场景的准确性和效率至关重要&#xff0c;逐渐成为行业前沿关注热点。在此方面&#xff0c;IoTDB 已迈出支持 AI 深度分析的重要一步&#xff0c…

240806-在Linux/RHEL开机中自动启动bash脚本

A. 常规方法 要在Red Hat Enterprise Linux (RHEL) 中设置开机启动的bash脚本&#xff0c;可以使用以下方法之一&#xff1a; 方法1&#xff1a;使用/etc/rc.d/rc.local 打开/etc/rc.d/rc.local文件&#xff1a; sudo vi /etc/rc.d/rc.local在文件末尾添加你想要执行的bash脚…

Plus机型成为历史?iPhone 17系列带来全新阵容

苹果公司一直以来都是科技创新的领航者&#xff0c;每一次新品发布都会引发全球消费者的热烈关注。据最新消息&#xff0c;苹果计划于2024年秋季推出全新的iPhone 17系列&#xff0c;这一代iPhone将以其独特的设计、卓越的性能和创新的功能再次刷新人们对智能手机的认知。 一、…

【算法设计题】基于front、rear和count的循环队列初始化、入队和出队操作,第6题(C/C++)

目录 第3题 基于front、rear和count的循环队列初始化、入队和出队操作 得分点&#xff08;必背&#xff09; 题解&#xff1a;基于front、rear和count的循环队列初始化、入队和出队操作 数据结构定义 代码解答 详细解释 1. 循环队列初始化 2. 循环队列入队 3. 循环队列…

分库分表的使用场景和中间件

文章目录 一、为什么要分库分表&#xff1f;分库分表的使用场景&#xff1f;二、分库分表常用中间件1、Cobar2、TDDL3、Atlas4、Sharding-jdbc5、Mycat6、总结 一、为什么要分库分表&#xff1f;分库分表的使用场景&#xff1f; 场景1&#xff1a;注册用户就 20 万&#xff0c…

1.4 C 程序的编译过程与 CLion 调试技巧

目录 1 程序的编译过程 1.1 编写源代码 1.2 预处理&#xff08;Preprocessing&#xff09; 1.3 编译&#xff08;Compilation&#xff09; 1.4 汇编&#xff08;Assembly&#xff09; 1.5 链接&#xff08;Linking&#xff09; 1.6 执行 2 编译过程的输入输出文件概览 …

7-1 深度学习硬件:CPU和GPU

L 3 L3 L3、 L 2 L2 L2、 L 1 L1 L1为cache&#xff0c;数据只有进入寄存器的时候&#xff0c;才能开始运算。 &#xff08;此图错误&#xff0c;一个矩阵应该是按行存储的&#xff01;&#xff09; GPU的核要远远多于CPU&#xff0c;从而TFLOPS&#xff0c;GPU每秒能做的…

Vue3.0与Echarts5

1.课程介绍与目标 有句话说的好“一图胜千言”&#xff0c;在我们开发的领域就是说&#xff0c;在对于复杂难懂且体量庞大的数据展示上面而言&#xff0c;图表的信息量要大得多&#xff0c;这也是我们为什么要谈数据可视化。https://notes.xiyankt.com/#/echarts/echarts​ stu…

深入理解 Apollo Client 的缓存策略

前言 上一篇文章&#xff1a;Nextjs 使用 graphql&#xff0c;并且接入多个节点 介绍了如何接入 graphql&#xff0c;并且使用 Apollo client 来请求和操作数据。后面深入了解了一下其缓存策略&#xff0c;想着有必要整理出来&#xff0c;作为后续学习。有任何问题还请批评指正…

八股之Java基础

注&#xff1a;本文部分内容源自Java 面试指南 | JavaGuide 一、基础概念与常识 1.JVM、JDK、JRE JVM&#xff1a;Java Virtual Machine&#xff0c;虚拟机&#xff0c;运行Java字节码&#xff0c;实现Java的平台无关性 JDK&#xff1a;Java Development Kit&#xff0c;Ja…

PwnLab: init-文件包含、shell反弹、提权--靶机渗透思路讲解

Vulnhub靶机链接回【PwnLab】 首页有一个登录框 image-20240807124822770 他没有验证码&#xff0c;我们试试暴力破解 image-20240807122743025 开始爆破了&#xff0c;全部失败&#xff0c;哈哈哈 image-20240807122851001 nmap全端口扫描试试 image-20240807131408315 有…

无法访问jakarta.servlet.http.HttpServletRequest

1、问题 无法访问jakarta.servlet.http.HttpServletRequest2、原因 JDK1.8升级到高版本后&#xff0c;需要手动引入jakarta.servlet-api 3、解决 增加依赖 <dependency><groupId>jakarta.servlet</groupId><artifactId>jakarta.servlet-api</ar…

6.2.面向对象技术-UML图

UML UML事物关系依赖关联聚合组合 泛化实现 类图对象图用例图序列图通信图状态图活动图构件图部署图练习题 UML 上午选择题3-4分&#xff0c;下午案例分析必考 UML是统一建模语言&#xff0c;和程序设计语言并无关系。 UML三个要素&#xff1a;UML的基本构造块、支配这些构造…

代码随想录算法训练营第二十一天 | 77. 组合, 216.组合总和III , 17.电话号码的字母组合

目录 77. 组合 思路 回溯法三部曲 方法一&#xff1a; 回溯未剪枝 方法二&#xff1a;回溯剪枝 心得收获 216.组合总和III 思路 方法一&#xff1a;回溯-没有使用sum来统计path里元素的总和 方法二&#xff1a;回溯&#xff0c;使用sum来保存当前路径上的总和 心得…

如何应用OceanBase 的实时SQL诊断,解决AP场景下的痛点

随着数据量的快速增长与用户需求的变化&#xff0c;数据库的管理与优化工作日益凸显其重要性。作为DBA及开发者&#xff0c;您是否曾面临以下挑战&#xff1a; ○ 分析场景下&#xff0c;在处理大规模数据的且耗时较长的查询是&#xff0c;常涉及海量数据的处理及复杂的计算&…

Python 设计模式之工厂函数模式

文章目录 案例基本案例逐渐复杂的案例 问题回顾什么是工厂模式&#xff1f;为什么会用到工厂函数模式&#xff1f;工厂函数模式和抽象工厂模式有什么关系&#xff1f; 工厂函数模式是一种创建型设计模式&#xff0c;抛出问题&#xff1a; 什么是工厂函数模式&#xff1f;为什么…

Vue3学习笔记第一天

MVVM Vue是一种用于构建用户界面的JavaScript框架。MVVM 是Vue采用的一种软件架构模式&#xff0c;用于构建交互式的用户界面。它的全称是 Model-View-ViewModel&#xff0c;这三个部分分别代表了应用程序的不同层次和角色&#xff1a; Model&#xff08;模型&#xff09;&…

【ARM】v8架构programmer guide(3)_ARMv8的寄存器

目录 4.ARMv8 registers 4.1 AArch64 特殊寄存器 4.1.1 Zero register 4.1.2 Stack pointer &#xff08;SP) 4.1.3 Program Counter &#xff08;PC) 4.1.4 Exception Link Register(ELR) 4.1.5 Saved Process Status Register &#xff08;SPSR&#xff09; 4.2 Proc…