Hive 分配方式与不分配方式

Hive distribute by vs without distribute by

这听起来很基础,但这个问题困扰了我一段时间。

假设我有以下查询

SELECT s.ymd, s.symbol, s.price_close FROM stocks s
SORT BY s.symbol ASC;

在这种情况下,如果数据在符号列上分布良好,那么基于符号列进行分布是有意义的,这样所有的 reducer 都能很好地共享数据;将查询更改为以下内容会提供更好的性能

SELECT s.ymd, s.symbol, s.price_close FROM stocks s
DISTRIBUTE BY s.symbol
SORT BY s.symbol ASC, s.ymd ASC;

不指定distribute by子句有什么影响?在第一个查询中选择的默认映射输出键列是什么,即它分布在什么列上?

有详细信息。我认为这就是您正在寻找的答案。 https://cwiki.apache.org/confluence/display/Hive/LanguageManual+SortBy

我自己找到了答案。使用排序依据时,映射器的输出键不是应用排序依据的列。键可以是记录的文件偏移量。 reducer 的输出按每个 reducer 排序,但按列值排序的相同内容可能出现在多个 reducer 的输出中。这意味着减速器的输出之间存在重叠。分布方式确保数据根据按列分布在 reducer 之间拆分,因此通过确保相同的列值进入相同的 reducer 以及相同的输出文件。