Hive Sort Merge Bucket Join

Bag*_*thi 2 hive join

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

将"设置hive.auto.convert.sortmerge.join = true"这个提示单独用于SMB加入吗?否则,还应包括以下提示.

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

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

如果我错了,请纠正我.

小智 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 ;

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

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

  1. 数据在相同的列上分布,并在ON子句中使用.
  2. 一个表的桶数必须是另一个表的桶数的倍数.

如果满足所有要求,则将执行MAP连接.它会闪电般快速.

顺便说一下,Hive 1.X for ORC格式不支持SMB Map Join.您将获得一个null异常.该错误已在2.X中修复.