Hive Sort Merge Bucket加入

时间:2016-11-04 17:07:31

标签: join hive

排序合并Bucket Join与Sort Merge Bucket不同 Map join?如果是这样,应该添加什么提示以启用SMB加入? SMBM如何优于SMB加入?

将"设置为hive.auto.convert.sortmerge.join = true"这个提示单独就足以让SMB加入?否则,还应包括以下提示。

设置hive.optimize.bucketmapjoin = true set hive.optimize.bucketmapjoin.sortedmerge = true

我问的原因是,提示说Bucket map join,但是这里没有执行MAP join。我假设map和reduce任务都涉及SMB,而SMBM只涉及map任务。

如果我错了,请纠正我。

1 个答案:

答案 0 :(得分:6)

如果您的表很大(由“set hive.mapjoin.smalltable.filesize;”确定),则无法进行地图侧连接。除了你的表被分区和排序,并且你打开“set hive.optimize.bucketmapjoin.sortedmerge = true”,你仍然可以在大型表上进行地图侧连接。 (当然,你还需要“set hive.optimize.bucketmapjoin = true”)

确保您的表格是真正的分块并在同一列上排序。犯错很容易。要获得一个分区和排序的表,您需要

  1. set hive.enforce.bucketing = true;
  2. set hive.enforce.sorting = true;
  3. DDL脚本

    CREATE table XXX ( id int, name string ) CLUSTERED BY (id) SORTED BY (id) INTO XXX BUCKETS ; INSERT OVERWRITE TABLE XXX select * from XXX CLUSTER BY member_id ;

  4. 使用describe formatted XXX并查找Num Buckets, Bucket Columns, Sort Columns以确保其设置正确。

    存储桶连接的其他要求是两个表应该

    1. 数据在相同的列上分布,并在ON子句中使用。
    2. 一个表的桶数必须是另一个表的桶数的倍数。
    3. 如果满足所有要求,则将执行MAP连接。它会闪电般快速。

      顺便说一下,Hive 1.X for ORC格式不支持SMB Map Join。你会得到一个null exception。该错误已在2.X中修复。