1、Sort By:分区内有序
2、Order By:全局排序,只有一个Reducer
3、Distrbute By:类似MR中的Partition,进行分区,结合sort by使用
4、Cluster By:当Distrbute By和Sort By字段相同时,可以使用Cluster By方式。Cluster By除了具有Distrbute By的功能还有Sort By的功能。但是排序只能是升序排序,不能指定排序规则为ASC或者DESC。
窗口函数:
RANK()排序相同时会重复,总数不会变
DENSE_RANK()排序相同时会重复,总数会减少
ROW_NUMBER()根据顺序计算
调优方案:
Fetch抓取
Hive针对某些情况的查询可以不必使用MapReduce计算。例如select * from score;在这种情况下,Hive可以简单地读取source对应的存储目录下的文件,然后输出查询结果到控制台。通过设置hive.fetch.task.conversion参数,可以控制查询语句是否走了MapReduce。
假如hive.fetch.task.conversion设置成none,表示所有执行的查询语句都会走mr程序
假如hive.fetch.task.conversion设置成more,表示所有执行的查询语句都会走mr程序
本地模式
大多数的Hadoop Job是需要Hadoop提供完整的可扩展性来处理大数据集的。不过,有时候Hive的输入数据流是非常小的。在这种情况下,为查询触发执行任务时消耗可能会比实际job的执行时间要多的多。对于大多数这种情况,Hive可以通过本地模式在单台机器上处理所有的任务。对于小数据集,执行时间可以明显被缩短。
用户可以设置hive.exec.mode.local.auto的值为true,来让Hive在适当的时候自动启动这个优化。
MapJoin
如果不指定MapJoin或者不符合MapJoin的条件,那么Hive解析器就会在Reduce阶段完成join,容易发生数据倾斜。可以用MapJoinba把小表全部加载到内存在map端进行join,避免reducer处理。
set hive.auto.convert.join = true
大表小表的阈值设置(默认25M以下认为是小表)
set hive.mapjoin.smalltable.filesize = 25123456
Group By
默认情况下,Map阶段同一key数据分发给一个reduce,当一个key数据过大时就倾斜了。并不是所有的聚合操作都需要在Reduce端完成,很多聚合操作都可以先在Map端进行部分聚合,最后在Reduce端得出结果。
是否在Map端进行聚合,默认为True
set hive.map.aggr = true;
在Map端进行聚合操作的条目数据
set hive.groupby.mapaggr.checkinterval = 100000;
有数据倾斜的时候进行负载均衡(默认是false)
set hive.groupby.skewindata = true
当选项设定为true,生成的查询计划会有两个MR Job,相当于相同的Group By Key会被分到不同的Reduce中
Count(distinct)
数据量大的时候,由于Count Distinct操作需要一个Reduce Task完成,这一个Reduce需要处理的数据量太大,就会导致整个Job很难完成,一般Count Distinct使用先Group By再Count的方式替换
笛卡尔积
尽量避免笛卡尔积,意思就是避免join的时候不加on条件或者无效的on条件,Hive只能使用1个reducer来完成笛卡尔积。