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