我想使用以下选项执行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;
Run Code Online (Sandbox Code Playgroud)
必须对两个表进行分块并在连接列上进行排序.我的问题是 - 没有那种必须是全球性的,即在第一桶钥匙放在了第二桶小于键,或者是足够了每个桶排序?
您必须将CLUSTERED BY相同列的相同列和SORTED BY相同列定义为INTO相同数量的存储桶.
然后,当你列出了你必须设置上面的设置和写的提示/*+MAPJOIN(x)*/,其中x是一个表.
此外,两个表必须在join子句中按原样连接,并且在连接之前不能在子查询中使用任何表,因为数据不会是桶并在首先发生的子查询之后排序.
最后,连接列必须是表格被打包/排序的列.
将数据插入表时,可以使用hive.enforce.sortingsetting(设置为true)或手动编写sort命令.
Hive不会检查存储桶是否实际已排序,因此如果它们不存在,则可能会导致输出中出现错误结果.
每个映射器将从第一个表读取一个桶,从第二个表读取相应的桶,它将执行合并排序连接.
对于你的问题 - 不,他们没有全局排序.
PS
你应该在运行查询之前发出EXPLAIN命令,你会看到hive是否计划进行Merge-sort bucket join或no.