在Hive中输入排序合并桶映射连接

时间:2013-07-10 17:16:25

标签: join hadoop map hive bucket

我想使用以下选项执行Hive手册(Bucketed Map Join)中所述的排序合并连接

set hive.input.format=org.apache.hadoop.hive.ql.io.BucketizedHiveInputFormat;
set hive.optimize.bucketmapjoin = true;
set hive.optimize.bucketmapjoin.sortedmerge = true;

两个表都必须在连接列中进行分段和排序。我的问题是 - 排序必须是全局的,即第一个桶中的密钥是否小于第二个桶中的密钥,或者每个桶的排序是否足够?

1 个答案:

答案 0 :(得分:5)

您必须将表格定义为CLUSTERED BY相同的列和SORTED BY相同的列,其顺序为INTO相同数量的存储桶。
然后,您必须按照列出 AND 设置上述设置,写下提示/*+MAPJOIN(x)*/,其中x是其中一个表格。
此外,两个表必须在join子句中按原样连接,并且在连接之前不能在子查询中使用任何表,因为数据不会是桶并在首先发生的子查询之后排序。 最后,连接列必须是表格被打包/排序的列。

将数据插入表格时,您可以使用hive.enforce.sorting设置(设置为true)或手动编写排序命令。
Hive不会检查存储桶是否实际排序,因此如果不这样做可能会导致输出中出现错误结果

每个映射器将从第一个表读取一个存储桶,从第二个表读取相应的存储桶,它将执行合并排序连接。

对于您的问题 - 不,他们不必全局排序。

P.S。
您应该在运行查询之前发出EXPLAIN命令,并且您将看到Hive是否计划进行合并排序存储桶加入或不进行。