【发布时间】:2015-08-01 00:44:56
【问题描述】:
历史上是否有人在 Hive 13 中成功执行了桶式地图连接?关于 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 自动将我的懒惰、超慢、常规的旧 reducer 连接转换为轻巧(甚至苗条?)、快速完成、分桶的 map 连接。也许我在这里遗漏了一些参数?
我的表都正确存储。它们都被分到 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;
此命令导致减速器连接缓慢而稳定。它运行良好,但速度很慢。
需要注意的一点是这些表是分区的。我只对加入分区值(天)= 90 的这些表感兴趣。这些表被分区的事实是否会破坏分桶映射连接?
我还尝试使用/*+MAPJOIN(EV)*/ 显式设置地图连接提示。
这会强制使用普通的 mapjoin,而不是 bucketed mapjoin。 Hive 尝试将整个 small(er) table 加载到 hashmap 中,并且很快就会耗尽内存。
【问题讨论】:
标签: join dictionary hive bucket