Hive高级查询
- 查询操作
- group by、Order by 、Join 、distribute by 、Sort by 、cluster by 、Union all
- 底层的实现
- Mapreducer
- 几个简单的聚合操作
- count 计数
- count(*) count(1) count(col)
- sum 求和
- sum(可转成数字的值)返回bigint
- sum(col) + cast(1 as bigint)//必须进行类型转换
- avg 求平均值
- avg(可转成数字的值) 返回double
- distinct 不同值个数
- count(distinct col)
- count 计数
Order by
- 按照某些字段排序
- 样例
- select col1,other…
- from table
- where condition
- oreder by col1,col2 [asc|desc]
- 注意
- order by 后面可以有多列进行排序,默认按字典排序
- order by 为全局排序
- order by 需要reduce操作,且只有一个reduce,与配置无
Group by
- 按照某些字段的值进行分组,有相同值放到一起
- 样例
- select col1[,col2],count(1),sel_expr(聚合操作)
- from table where condition
- group by col1[,col2]
- [having…]
- 注意
- select后面非聚合列必须出现在group by中
- 除了普通列就是一些聚合操作
- group by后面也可以跟表达式,比如substr(col)
- 特性
- 使用了reduce操作,受限于reduce数量,设置reduce参数mapred.reduce.tasks
- 输出文件个数与reduce数相同,文件大小与reduce处理的数据量有关
- 问题
- 网络负载过重
- 数据倾斜,优化参数hive.groupby.skewindata=true
Join
- 表连接
- 两个表m,n之间按照on条件连接,m中的一条记录和n中的一条记录组成一条新的记录
- join等值连接,只有某个值在m和n中同时存在时才输出
- left outer join左外连接,左边表中的值无论是否在b中存在时,都输出,右边表中的值只有在左边表中存在时才输出
- right outer join 和left outer join相反
- left semi join 类似exists
- mapjoin 在map端完成join操作,不需要用reduce,基于内存做join,属于优化操作
- 样例
- select m.col as col,m.col2 as col2,n.col3 as col3
- from(select col,col2 from test where…(map端执行))m (左表)
- [left outer|right outer|left semi] join
- n (右表)
- on m.col=n.col
- where condition (reduce端执行)
- set hive.optimize.skewjoin=true;
Mapjoin
- mapjoin(map side join)
- 在map端把小表加载到内存中,然后读取大表,和内存中的小表完成连接操作
- 其中使用了分布式缓存技术
- 优缺点
不消耗集群的reduce资源(reduce相对紧缺)
减少了reduce操作,加快程序执行
降低网络负载
占用部分内存,所以加载到内存中的表不能过大,因为每个计算节点都会加载一次
生成较多的小文件
- 配置以下参数,是hive自动根据sql,选择使用common join或者map join
- set hive.auto.convert.join=true;
- hive.mapjoin.smalltable.filesize默认值是25mb
- 第二种方式,手动指定
- select /*+mapjoin(n) */ m.col,m.col2,n.col3 from m
- join n
- on m.col=n.col
- 简单总结一下,mapjoin的使用场景:
- 关联操作中有一张表非常小
- 不等值的链接操作
DIstribute by 和 Sort by
- Distribute分散数据
- distribute by col
- 按照col列把数据分散到不同的reduce
- Sort排序
- sort by col2
- 按照col列把数据排序
- select col1,col2 from M
distribute by col1
sort by col1 asc,col2 desc; - 两者结合出现,确保每个reduce的输出都是有序的
- distribute by 与group by 的对比
- 都是按key值划分数据
- 都使用reduce操作
- 唯一不同,distribute by只是单纯的分散数据,而group by把相同key的数据聚集到一起,后续必须是聚合操作
- order by与sort by
- order by是全局排序
- sort by只是确保每个reduce上面输出的数据有序,如果只有一个reduce时,和order by作用一样
- 应用场景
- map输出的文件大小不均
- reduce输出文件大小不均
- 小文件过多
- 文件超大
Cluster by
- 把有相同值得数据聚集到一起,并排序
- 效果
- cluster by col
- 等同于distribute by col order by col
Union all
- 多个表的数据合并成一个表,hive不支持union
- 样例
- select col
- form(
- select a as col from t1
- union all
- select b as col from t2
- )tmp
- 要求
- 字段名字一样
- 字段类型一样
- 字段个数一样
- 子表不能有别名
- 如果需要从合并之后的表中查询数据,那么合并的表必须要有别名