join - Hive 中排序合并桶映射连接的输入

标签 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;

两个表都必须在连接列上分桶和排序。我的问题是 - 排序是否必须是全局的,即第一个桶中的键小于第二个桶中的键,或者每个桶都排序就足够了吗?

最佳答案

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

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

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

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

附言
您应该在运行查询之前发出 EXPLAIN 命令,然后您将看到 Hive 是否计划执行合并排序桶连接。

关于join - Hive 中排序合并桶映射连接的输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17576907/

相关文章:

hadoop - 无法打开 map-reduce 输出 url

mysql - 在 where 子句 MySql 中使用嵌套选择查询

mysql - MySQL 中使用连接的慢查询

hadoop - 在配置单元中处理换行符

hadoop - 在Hadoop中自定义InputFormat

java - TreeMap 为某些对象键应该存在的值返回 null

scala - 如何在Scala中的过滤器, map ,flatMap期间轻松地从一种集合类型转换为另一种集合类型?

c++ - 关于 std::map 存储的布局有什么保证吗?

mysql - 如何连接多个关系表并按类型获取结果

r - 识别数据框 A 中未包含在数据框 B 中的记录