1.1 什么是Hive
- Hive简介
Hive:由FaceBook开源用于解决海量结构化日志的数据统计工具
Hive:基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL的查询功能。
- Hive本质
将HSQL转化成MapReduce程序
1.2 Hive的优缺点
1.2.1 优点
1.2.2 缺点
1.3 Hive运行机制
1.4 Hive和数据库比较
1.4.1 数据更新
1.4.2 执行延迟
1.4.3 数据规模
2.1 安装JDK
2.2 安装Hadoop
2.3 安装MySQL
2.4 安装Hive
2.4.1 安装
2.4.2 hive远程模式
- 上传mysql的jdbc驱动jar包到hive的lib下
- 分配权限
mysql> grant all privileges on . to ‘root’@‘%’ identified by ‘123456’ with grant option;
mysql> flush privileges;
mysql> grant all privileges on . to ‘root’@‘hadoop’ identified by ‘123456’ with grant option;
mysql> flush privileges;
- Navicat新建数据库hive
字符集:latin1
2.4.3 Thrift server
hive --service hiveserver2 &
beeline
!connect jdbc:hive2://hadoop:10000
2.5 Hive日志
3.1 基本数据类型
Hive的String类型相当于数据库的Varchar类型,是一个不可变的字符串
3.2 集合数据类型
例如 structStreet:String,city:string
例如 map<String,int>
例如 array
3.2.1 Array
3.2.2 Map
3.2.3 Struct
4.1 创建数据库
create database if not exists db_hive ;
默认存储路径是/usr/hive/warehouse/*.db
create database db_hive2 location ‘/db_hive2.db’;
创建一个数据库,指定数据库在HDFS上存储的位置
4.2 查询数据库
show databases;
show databases like ‘db_’;//过滤显示查询的数据库
desc database db_hive;//显示数据库信息
desc database extended db_hive;//显示数据库详细信息
use db_hive;//切换数据库
4.3 删除数据库
drop database if exists db_hive;//判断数据库存在并且删除
drop database db_hive cascade;//强制删除数据库
4.4 创建表
Hive通过Serde确定表的具体列的数据。
SerDe是Serialize、Deserilize的简称,hive使用serde进行对象的序列话和反序列化
4.4.1 管理表
4.4.2 外部表
4.4.3 管理表和外部表的应用场景
4.4.4 管理表和外部表的互相转换
desc formatted student;//查询表类型
alter table student set tblproperties(‘EXTERNAL’ = ‘TRUE’);//修改内部表为外部表
alter table student set tblproperties(‘EXTERNAL’ = ‘false’);//修改外部表为内部表
(‘EXTERNAL’=‘TRUE’)和(‘EXTERNAL’=‘FALSE’)为固定写法, 区分大小写!
4.5 修改表
4.5.1 重命名表
alter table table_name rename to new_table_name;
4.5.2 增加、修改、替换列信息
- 更新列
alter table dept change column dept name desc String;//将dept的name改成String类型
- 增加
alter table dept add columns(deptdesc string);
- 替换
alter table dept replace columns(deptno string,dname string,loc string);
- ADD是代表新增一字段,字段位置在所以列后面(partition 列前)
- replace则是表示替换表中所有的字段
5.1 数据导入
load data [local] inpath ‘date path’ [overwrite] into table student [partition (partcol1=val1.)]
hdfs dfs -put /opt/data/student.txt /user/hive;
- 创建表
create table student(id string, name string) row format
delimited fields terminated by ‘ ’;
- 导入数据
load data inpath ‘/user/hive/student.txt’ overwrite into table student;
5.2 通过查询语句向表中插入数据
- 基本插入数据
insert into table student values(1,‘zxy’),(2,‘zhou’)
- 基本模式插入
insert overwrite table student select id,name from students where month = ‘202107’
insert into :以追加的方式插入到表或分区,原有数据不会删除
insert overwrite:会覆盖表中已存在的数据
- 多分区插入模式
from student
insert overwrite table student partition(month = ‘202107’)
select id,name where month = ‘202108’
insert overwrite table studdent partition(month = ‘202106’)
select id,name where month = ‘202109’
5.3 数据导出
5.3.1 Insert导出
- 将查询结果导出到本地
insert overwrite local directory ‘/opt/apps/student’ select * from student;
- 将查询结果格式化导出到本地
insert overwrite local directory ‘/opt/apps/student’
- 将查询结果导出到HDFS
insert overwrite directory ‘/user/student’
5.3.2 Hadoop命令导出到本地
- hdfs命令导出
hdfs dfs -get /user/hive/student.txt /opt/apps/student.txt
- hive shell 命令导出
hive -e ‘select * from student;’ > /opt/apps/student/student.txt
- export导出到hdfs上
export table student to ‘/user/hive/student’
export 和 import 主要用于两个 Hadoop 平台集群之间 Hive 表迁移。
5.3.3 sqoop导出
5.3.4 清楚表中数据(Truncate)
truncate table student;
注意: Truncate 只能删除管理表, 不能删除外部表中数据
6.1 基本查询
6.1.1 tips
SQL语言大小写不敏感
SQL可以写在一行或者多行
关键字不能被缩写也不能分行
各子句一般要分行写
使用缩进提高可读性
6.1.2 别名
重命名一个列
便于计算
紧跟列名,也可以在列名和别名之间加入关键字‘AS’
6.1.3 算术运算符
6.1.4 常用函数
6.1.5 Limit
Limit子句用于限制返回的行数
select * from emp limit 5;
6.1.6 where语句
使用where语句,将不满足条件的过滤掉
where子句紧随from子句
select * from emp where sal in (1500,5000);
6.1.7 Like和RLike
- like
%代表零个或者多个字符
_表示一个字符
- Rlike
RLIKE可以使用正则表达式这个强大的功能
select * from emp where name RLIKE ‘[A]’;
6.2 分组
6.2.1 GROUP BY语句
GROUP BY语句经常和聚合函数一起使用,按照一个或者多个队列结果进行分组,然后对每个组执行聚合操作
6.2.2 Having语句
- having和where的不同点
where后面不能些分组函数,而having后面可以使用分组函数
having只用于group by分组统计语句
6.3 Join语句
- 尽量避免使用子查询,但是子查询不可避免
- 尽量避免过多的join查询,但是join查询不可避免
- 尽量不要使用in或者not in的语法
- 一定要使用小表驱动大表,因为hive在做查询的时候,首先缓存一部分数据(查看左边的表)。说白了就是数据量小的表尽量先查。
- 表别名的好处
使用别名可以简化查询
使用别名可以提高执行效率
交叉查询:access join: 产生笛卡尔积的查询
:左半连接
6.3.1 数据
6.3.2 内连接(inner join)
6.3.3 左外连接(left join)
A left join B
6.3.4 右外连接(right join)
A right join B
6.3.5 全连接(full join)
6.3.6 左半连接
B left semi join A
on A.id=B.id
6.3.7 多表连接
连接n个表,至少需要n-1个条件
6.3.8 笛卡尔积
笛卡尔积会在下面条件下产生
- 省略连接条件
- 连接条件无效
- 所有表中的所有行互相连接
6.3.9 in
select * from A where A.id in (select B.id from B)
6.3.10 子查询
总体来说,hive的子查询和sql的子查询是一样的。子查询只能出现在from之后或者where之后
子查询对别名的识别特别严格,任何的可以取别名的地方,定义一个别名
6.4 排序
6.4.1 全局排序(Order by)
全局排序,只有一个Reducer
- 使用OEDER BY子句排序
ASC(ascend):升序(默认)
DESC(descend):降序
6.4.2 每个Reduce内部排序(Sort by)
桶内有序,不保证全局有序
sort by : 对于大规模的数据集order by的效率非常低。很多情况下,并不需要全局排序,此时可以使用sort by
sort by为每个reduce产生一个排序文件,每个Reduce内部进行排序,对全局结果集来说不是排序
- 设置reduce个数
set mapreduce.job.reduces=3;
- 查看设置reduce个数
set mapreduce.job.reduces;
6.4.3 分区(Distribute by)
- tips
distribute by的分区规则是根据分区字段的hash码与reduce的个数进行模除后,余数相同的分到一个区。
Hive要求distribute by语句要写在sort by语句之前
6.4.4 Cluster By
当distribute by和sort by字段相同时,可以使用cluster by方式。
cluster by除了具有distribute by功能外,还具有sort by功能,但是排序只能是升序排序,不能指定排序规则为ASC或者DESC
select * from emp cluster by deptno;
select * from emp distribute by deptno sort by deptno;
7.1 分区表
7.2 分区表
7.3 把数据直接上传到分区目录上,让分区表和数据产生关联的三种方式
7.3.1 上传数据后修复
查询不到
- 修复数据
msck repair table dept_partition;
- 再次查询数据
7.3.2 上传数据后添加分区
- 添加分区
alter table ddept_partition add partition(day=‘20210725’,hour=‘8’)
7.3.3 创建文件夹后load数据到分区
load data local inpath ‘/opt/apps/dept_20210725.log’ into table dept_partiton partition(day=‘20210725’,hour=‘8’)
7.4 动态分区调整
7.4.1 开启动态分区
- 静态分区:加载数据的时候指定分区的值
- 动态分区:数据未知,根据分区的值创建分区
- 静态+动态
7.5 分桶
桶是比分区更细粒度的划分。当我们对表中的数据进行join的时候势必回产生笛卡尔积。桶就是可以帮助我们减少笛卡尔积。
分桶表的建立不可以直接导入数据,需要建立中间表
- 设置reduce个数,即为分桶数量
7.5.1 准备数据
7.5.2 建立中间表
7.5.3 分桶查询
7.5.4 建立分桶表
7.5.5 导入分桶表
7.5.6 采样查询
7.6 分区分桶表
需要开启非严格模式,若配置文件没有修改,可使用命令行操作
set hive.exec.dynamic.partition.mode=nonstrict;
7.6.1 中间表
7.6.2 创建分桶分区表
7.6.3 向表中导入数据
8.1 窗口函数定义
窗口函数又叫做开创函数,他是一种分析的函数,专门可以解决报表类型的需求分析。他专门用于计算基于组的某种聚合。对于每个组返回返回是多行,也就是聚合函数的分组只有显示一行
开窗函数指定了分析函数的窗口大小,窗口的大小会根据行的变化而变化
8.2 Over函数
8.2.1 数据
8.2.2 建表
8.3 排名函数
row_number():不存在并列成绩
eg:1,2,3,4
rank():有并列成绩,可以不按顺序排名
eg:1,2,2,4
dense_rank():有并列,名次相同,有顺序
eg:1,2,2,3
8.3.1 建表
8.3.2 案例
8.4 分区(partition by,distribute by)
8.5 排序(order by,sort by)
8.6 Window子句
8.6.1 举例
8.7 ntile函数:将结果分片编号
8.8 lead和lag
lag:返回当前数据行的上一行
lead:返回当前行数据行得下一行
8.9 first_value和last_value
9.1 数值函数
9.2 数学函数
9.3 条件判断
9.3.1 if(expr1,expr2,expr3)
如果expr1为true,返回expr2,否则返回expr3
9.3.2 case…when
类似于if…else
9.4 日期函数
9.5 字符串相关函数
9.6 统计函数
9.7 案例小结
9.7.1 单词统计
9.7.2 SQL
10.1 UDF
User Define Function:UDF
10.2 导入依赖
10.3 自定义生日转年龄
- 打包hive.jar
- 上传至hdfs
hdfs dfs -put /data/jars/hive.jar /common/jars/
- 新建函数
- 依赖
- 代码
12.1 row format delimited
12.2 fields terminated by ‘,’
12.3 SerDe类型
12.3.1 常用的SerDe
12.3.2 CSV测试
- 默认方式存储(逗号)
- 修改存储方式(空格)
12.3.3 Json测试
- 导入第三方json解析工具
hive (zxy) > add jar /data/jars/json-serde-1.3.9-SNAPSHOT-jar-with-dependencies.jar;
- json解析
12.3.4 RegEx
- 数据
- 处理思路
12.4 保存类型
12.4.1 不同存储类型
不能直接使用load的需要使用查询插入的方法
12.5 Hive数据导出
13.1 定义
13.2 索引测试
13.3 视图测试
14.1 hive -e
执行sql语句
14.2 hive -f
直接执行hive的脚本文件