历史上有没有人在Hive 13中成功地执行了一个分桶的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自动将我的懒惰的、超级慢的、常规的旧的缩减连接转换为轻便(svelte even?)、快速完成的、分桶的映射连接。也许我这里遗漏了一些参数?
我的表都是正确存储的。它们都被分到1024个存储桶中(这是不是太多了?)小表的存储桶大小约为15MB,大表的平均存储桶大小约为10 an。
下面是我的命令:
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;此命令将导致缓慢而稳定的异径管连接。它运行得很好,但速度非常慢。
需要注意的一点是,这些表是分区的。我只对连接分区值(天)= 90的表感兴趣。这些表被分区的事实会破坏分桶的映射连接吗?
我还尝试使用/*+MAPJOIN(EV)*/显式地设置映射连接提示。这会强制使用普通的mapjoin,而不是分桶的mapjoin。Hive试图将整个小(Er)表加载到hashmap中,但很快就耗尽了内存。
发布于 2015-05-28 06:40:46
我最终能够让它工作起来。似乎和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提示也是必要的。
https://stackoverflow.com/questions/30338331
复制相似问题