1.列裁剪
查询时我只关心用到的那几个列。
需要设置:hive.optimize.cp = true
2.分区裁剪
查询过程中减少不必要的分区。
需要设置:hive.optimize.pruner = true
3.join
join操作在recude阶段join左边表中的内容会被加载到内存中,将数据少的表放在左边可以减少内存溢出的发生。
4.map join
map join无需reduce操作就可以在map阶段全部完成,前提是在map阶段能够访问到全部需要的数据。
5.group by
map端部分聚合:
需要设置:
hive.map.aggr = true 设定是否在map端进行聚合 默认为true
hive.groupby.mapaggr.checkinterval = 10000 设定在map端进行聚合操作的条目数
有数据倾斜时进行负载均衡:
需要设置:
hive.groupby.skewindata = true 生成的查询计划会有两个mapreduce任务,第一个任务中的map输入会随机分到reduce中,对每个reduce做部分聚合,这样处理的结果是:相同的group by key有可能被分发到不同的reduce中,从而达到负载均衡的目的。第二个任务再根据预处理数据结果按照group by key分布到reduce中。
6.合并小文件
合并map和reduce的中间结果文件来提高效率
需要设置:
hive.merge.mapfiles = true 设定是否合并map输出文件 默认是true
hive.merge.mapredfiles = false 设定是否合并reduce输出文件 默认是flase
hive.merge.size.per.task = 256*1000*1000 设定合并文件的大小