hive高级查询

来源:互联网 发布:淘宝陈枝记铁锅有毒 编辑:程序博客网 时间:2024/06/05 17:55

查询操作
group by、order by、join、distribute by、sort by、cluster by、union all
底层的实现
mapreduce

简单的聚合函数
count
sum
avg
distinct

order by全局排序
order by 需要reduce操作,且只有一个reduce,与配置无关
如果数据量大的话,会很浪费资源

order by过程
从表读取数据,执行where条件,以col1、col2列的值做成组合key,其他列值作为value,然后把数据传到同一个reduce,根据需要的方式进行排序

group by
select 后非聚合列必须放在group by后
使用了reduce操作,受限于reduce数量,设置reduce参数mapred.reduce.tasks
输出文件个数与reduce数相同,文件大小与reduce处理的数据量有关
优化
set hive.groupby.skewindata=true;
执行过程
读取数据,执行where条件,按col列分组,把col列的内容作为key,其他列作为value传到reduce,在reduce端执行聚合操作,和having过滤

join表连接
join等值连接
left outer join左外连接
right outer join右外连接
left semi join 类似exists
mapjoin在map端完成操作,不需要reduce,基于内存做join,属于优化操作

distribute by col按照col列把数据分散到不同的reduce
sort排序
select col1,col2 from table distribute by col1 sort by col1 desc,col2 asc
两者结合出现,确保每个reduce的输出都是有序的

distribute by与group by
都是按key划分数据
都是用reduce操作
唯一不同,distribute by只是淡村的分散数据,而group by把相同的key的数据聚集到一起,后续必须是聚合操作

order by 与sort by
order by是全局排序
sort by只是确保每个reduce上面输出的数据有序,如果只有一个reduce时,和order by同

cluseter by
把有相同值的数据聚集到一起,并排序
cluseter by col同distribute by col order by col

hive只支持union all,不支持union
多个表的数据合并成一个表

0 0
原创粉丝点击