分组聚合优化
SELECT
coupon_id,
count(1)
FROM
dwd_trade_order_detail_inc
WHERE
dt = '20230-06-16'
GROUP BY
coupon_id;
优化思路为map-side聚合。所谓map-side聚合,就是在map端维护一个hash table,利用其完成分区内的、部分的聚合,然后将部分聚合的结果,发送至reduce端,完成最终的聚合。map-side聚合能有效减少shuffle的数据量,提高分组聚合运算的效率。
--启用map-side聚合
set hive.map.aggr=true;
--hash map占用map端内存的最大比例,超过会落盘,最后一个参数
set hive.map.aggr.hash.percentmemory=0.5;
--用于检测源表是否适合map-side聚合的条数
set hive.groupby.mapaggr.checkinterval=100000;
--map-side聚合所用的HashTable,占用map任务堆内存的最大比例,若超出该值,则会对HashTable进行一次flush
set hive.map.agggr.hash.force.flush.memory.treshold=0.9;
Join优化
Hive Join类型
Hive拥有多种join算法,包括:Common Join,Map Join, Sort Merge Bucket Map Join等。
Common Join
Map端负责读取参与join表的数据,并按照关联字段进行分区,将其发送到Reduce端,Reduce端完成最终的关联操作。即Reduce Join
Map Join
若参与的Join表中,有n-1张足够小,Map端就会缓存小表全部数据,然后扫描另外一张大表,在Map端完成关联操作。
Sort Merge Bucket Map Join
若参与join的表均为分桶表,切关联字段为分桶字段,且分桶字段是有序的,且大表分桶数量是小表分桶数量的整数倍。此时,就可以以分桶为单位,为每个Map分配任务了,Map端就无需再缓存小表的全部数据了,而只需缓存其需的分桶。
比如,用户表12G,用户订单表120G,这两个进行Join时可以采用该优化手段
Map Join优化
Map Join相关参数
--启用map join自动转换,默认为true
set hive.auto.convert.join = true
--common join 转 map join小表阈值,10MB
set hive.auto.convert.join.noconditionaltask.size = 10000000
可以通过以下命令获取表的大小
desc formatted table_name;
参看rawDataSize
Sort Merge Bucket Map Join
SELECT
*
FROM (
SELECT
*
FROM dim_user_zip --12GB
WHERE
dt = '9999-12-31'
) duz
JOIN (
SELECT
*
FROM
dwd_trade_order_detail_inc --160GB
WHERE
dt = '2020-06-16'
) dtodi
ON duz.user_id = dtodi.user_id;

最低0.47元/天 解锁文章
538

被折叠的 条评论
为什么被折叠?



