配置单元中排序合并桶Map联接的输入

clj7thdc  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(420)

我想使用以下选项执行一个排序合并联接,如配置单元手册(带方框的Map联接)中所述

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

这两个表都必须在联接列上进行装箱和排序。我的问题是-排序是否必须是全局的,即第一个bucket中的键小于第二个bucket中的键,或者每个bucket都进行排序就足够了?

dgsult0t

dgsult0t1#

必须定义要创建的表 CLUSTERED BY 同一列和 SORTED BY 同一列中的同一顺序 INTO 相同数量的桶。
然后,您必须设置上面列出的设置并编写提示 /*+MAPJOIN(x)*/ 其中x是一个表。
另外,两个表都必须按照join子句中的原样进行联接,并且不能在联接之前的子查询中使用any,因为数据不会在首先发生的子查询之后被存储桶和排序。
最后,联接列必须是表的绑定/排序列。
将数据插入表时,可以使用 hive.enforce.sorting 设置(设置为true)或手动写入排序命令。
hive不会检查bucket是否已实际排序,因此如果它们没有排序,则可能会导致输出中出现错误的结果。
每个Map程序将从第一个表中读取一个bucket,从第二个表中读取相应的bucket,并执行合并排序联接。
对你的问题-不,他们不需要全球排序。
附笔
您应该在运行查询之前发出explain命令,然后查看hive是否计划执行合并排序bucket连接。

相关问题