order by
需要reduce操作,且 只有一个reduce,与配置无关。 数据量很大时,慎用。
group by
使用了reduce操作, 受限于reduce数量,设置reduce参数 mapred.reduce.tasks
输出文件个数与reduce数相同
数据倾斜,优化参数 hive.groupby.skewindata为true,会启动一个优化程序,避免数据倾斜。
left semi join
类似 exists。即查找a表中的数据, 是否在b表中存在,找出存在的数据。
mapjoin
在map端完成join操作,不需要用reduce,基于内存做join,属于优化操作,其中使用了分布式缓存技术。
mapjoin顾名思义,就是在map端完成join操作,把小数据集分发到map的每台机器上去做join,避免shuffle操作
distribute by与group by对比
都是按key值划分数据
都使用reduce操作
**唯一不同的是**distribute by只是单纯的分散数据,而group by把相同key的数据聚集到一起,后续必须是聚合操作。
distribute by也是存在数据倾斜问题的,热点key会被分布到个别reduce节点上
order by与sort by 对比
order by是全局排序
sort by只是确保每个reduce上面输出的数据有序。如果只有一个reduce时,和order by作用一样。
cluster by
把有相同值的数据聚集到一起,并排序。
效果等价于distribute by col sort by col
cluster by col <==> distribute by col sort by col
union all
多个表的数据合并成一个表,hive不支持union
是不是map数越多越好?
答案是否定的。如果一个任务有很多小文件(远远小于块大小128m),则每个