我想按照 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;
两个表都必须在连接列上分桶和排序。我的问题是 - 排序是否必须是全局的,即第一个桶中的键小于第二个桶中的键,或者每个桶都排序就足够了吗?
最佳答案
您必须将表定义为 CLUSTERED BY
相同的列和 SORTED BY
相同的列以相同的顺序 INTO
相同数量的桶。
然后,您必须按照列出的方式设置上述设置并编写提示/*+MAPJOIN(x)*/
,其中x是其中一个表。
此外,两个表都必须按原样在连接子句中连接,并且在连接之前不能在子查询中使用任何表,因为数据不会在首先发生的子查询之后进行存储和排序。
最后,连接列必须是表被分桶/排序的列。
当您将数据插入表中时,您可以使用 hive.enforce.sorting
设置(设置为 true)或手动编写排序命令。
Hive 不会检查存储桶是否实际排序,因此如果它们未排序,则可能会导致输出中出现错误结果。
每个映射器将从第一个表中读取一个桶,从第二个表中读取相应的桶,并将执行合并排序连接。
对于您的问题 - 不,他们不必全局排序。
附言
您应该在运行查询之前发出 EXPLAIN 命令,然后您将看到 Hive 是否计划执行合并排序桶连接。
关于join - Hive 中排序合并桶映射连接的输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17576907/