Hive 0.13 bucketed map join

时间:2015-05-20 00:32:24

标签: join dictionary hive bucket

历史上有没有人成功在Hive 13中执行了一个bucketed map join? BMJ(http://www.openkb.info/2014/11/understanding-hive-joins-in-explain.html#.VVuZZpNVikohttps://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)表加载到散列映射中,并且很快耗尽内存。

1 个答案:

答案 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提示也是必要的。