Hive简介
a). Hive是一个大数据的数据仓库工具, 提供基于thrift的远程端口
b). 可以利用zk来做容灾
c). 支持内部表和外部表(HBASE/Mongodb)
Hive 分隔符
lines分隔符:\n//Hive的行分隔符只支持‘\n’
fields分隔符:默认^A(Ctrl+A),建表时用八进制编码\001表示
ARRAY、STRUCT中的元素或者MAP中键值对的分隔符:默认^B(\002)
MAP键和值之间的分隔符:默认^C,八进制编码\003表示;
使用HIVE需要注意的地方
a). 不支持update\delete
b). 大表采用分区表
Hive数据类型 (原子数据类型/复杂数据类型)
原子数据类型复杂数据类型
Hive分区表(动态分区与静态分区)
insert overwrite table tbl_name partition(pt, if_online) select field1, field2, ..., pt, if_online from tbl where xxx;
insert overwrite table tbl_name partition(pt=20121023, if_online=1) select field1, field2, ..., fieldn from tbl where xxx;
区别):
a).静态分区一 定会创建分区,不管SELECT语句的结果有没有数据。
b).动态分区,只有在SELECT结果的记录数>0的时候,才会创建分区
HQL
需要注意的地方
a).hive本身缺陷,需要在每个子查询后面加别名
select a,b,c from (select a,b,c from (select a,b,c from table) a where rno = 1) tb group by a;
b). 避免数据倾斜
表现的情况:任务进度长时间维持在99%(或100%),查看任务监控页面,发现只有少量(1个或几个)reduce子任务未完成。
要尽早的过滤数据和裁剪数据,减少后续处理的数据量,使得join key的数据分布较为均匀,将空字段随机赋予值,这样既可以均匀分发倾斜的数据
强大的SQL统计功能
a). 多表插入功能
from test insert overwrite table test1 partition(dt=20170915,hour=17)
select id,name,last_time insert overwrite table testx select id,name;
b). 增量表与全量表的合并(对update的补充)
insert overwrite table service_all select * from service_tmp
union all select a.* from service_all a left outer join service_tmp b
on a.service_code = b.service_code where b.service_code is null;
c). 窗口函数
1).与group by对比
gourp by: 一条记录
over : 多条记录
开窗函数over()分析函数包含三个分析子句:
分组子句(partition by), 排序子句(order by), 窗口子句(rows)
select id,create_time,amount,sum(amount) over(partition by id order by create_time asc rows between 2 preceding and 2 following ) amount_all
image.png
网友评论