1

我想使用以下选项执行 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;

两个表都必须在连接列上进行存储和排序。我的问题是 - 排序必须是全局的,即第一个桶中的键小于第二个桶中的键,还是每个桶都排序就足够了?

4

1 回答 1

5

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

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

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

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

PS
您应该在运行查询之前发出 EXPLAIN 命令,您将看到 hive 是否计划执行 Merge-sort bucket join 或不。

于 2013-07-11T16:29:30.080 回答