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