历史上有没有人成功在Hive 13中执行了一个bucketed map join? BMJ(http://www.openkb.info/2014/11/understanding-hive-joins-in-explain.html#.VVuZZpNViko和https://cwiki.apache.org/confluence/download/attachments/27362054/Hive%2BSummit%2B2011-join.pdf)的文档数量有限。他们看起来很棒,但我无法让他们工作。
如果我理解正确,我必须使用以下参数启动我的命令:
SET hive.optimize.bucketmapjoin=true;
这将导致Hive自动将我的懒惰,超慢,常规旧的减速器连接转换为轻盈(苗条均匀?),快速完成,分段映射连接。也许我在这里错过了一些参数?
我的桌子都被正确地敲了一下。它们都被分成1024个桶(这可能太多了吗?)。小桌子的桶大小约为15MB,大桌子的平均桶大小为10GB。
以下是我的命令:
SET hive.optimize.bucketmapjoin=true;
SELECT
EV.advertiser_id,
EV.pixel_id,
RDB.segment_id
FROM
rakuten_segment_index2_bucketed_event_logs_ddp EV
JOIN rakuten_sir_bucketed_rdb RDB
ON EV.mm_uuid = RDB.mm_uuid
WHERE
EV.days = 90 AND RDB.days = 90;
此命令会导致缓慢且稳定的reducer连接。它运行良好,但速度很慢。
需要注意的是,这些表是分区的。我只对加入这些分区值(天)= 90的表感兴趣。这些表是否被分区的事实会破坏分段映射连接吗?
我还尝试使用/*+MAPJOIN(EV)*/
显式设置地图连接提示。
这会强制执行正常的mapjoin,而不是一个bucketed mapjoin。 Hive尝试将整个小(er)表加载到散列映射中,并且很快耗尽内存。
答案 0 :(得分:1)
我最终能够让它发挥作用。似乎与hive.mapjoin.bucket.cache.size
有关。
尝试将此值设置为高于默认值(我认为为10或100)。我的工作顺利如下:
SET hive.optimize.bucketmapjoin=true;
set hive.exec.reducers.max = 30000;
set hive.mapjoin.bucket.cache.size=100000000;
SELECT /*+MAPJOIN(EV)*/
EV.advertiser_id,
EV.pixel_id,
RDB.segment_id
FROM
tbl_a EV
JOIN tbl_b RDB
ON EV.mm_uuid = RDB.mm_uuid
WHERE
EV.days = 90 AND RDB.days = 90;
注意:mapjoin
提示也是必要的。