HIVE中的DISTRIBUTE BY条款

时间:2017-02-14 18:51:02

标签: hive hiveql hadoop2

我无法理解这个DISTRIBUTE BY子句在HIVE中的作用。我知道这个定义,如果我们有DISTRIBUTE BY(城市),这将使每个城市以不同的REDUCER发送,但我没有得到相同的结果。让我们考虑如下数据:

表数据:

+----------+--------+
| username | amount |
+----------+--------+
| user_1   | 25     |
+----------+--------+
| user_1   | 53     |
+----------+--------+
| user_1   | 28     |
+----------+--------+
| user_1   | 50     |
+----------+--------+
| user_2   | 20     |
+----------+--------+
| user_2   | 50     |
+----------+--------+
| user_2   | 10     |
+----------+--------+
| user_2   | 5      |
+----------+--------+

假设我们有一个包含用户名金额列的TABLE数据。

现在,如果我说 -

select username,sum(amount) from data DISTRIBUTE by (name)

不应该运行2个单独的减速器吗?它还在运行一个减速机,我不知道为什么?我认为这可能与CLUSTERING INTO BUCKETS或PARTITIONING有关但我尝试了一切,仍然运行一个减速器可以解释为什么?

2 个答案:

答案 0 :(得分:5)

唯一DISTRIBUTE BY (city)说的是具有相同city的记录将转到同一个reducer。没别了。

  

Hive使用Distribute By中的列来分配行   减速。具有相同Distribute By列的所有行将转到   相同的减速机

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+SortBy

OP的问题:

  

那么DISTRIBUTE BY有什么意义呢?没有保证   每个(城市)会去一个不同的减速器然后为什么要用呢?

有两个原因:

  1. 在配置单DISTRIBUTE BYSORT BYCLUSTER BY的开头,用于以今天自动完成的方式处理数据(例如,分析函数{{3} })

  2. 您可能希望通过脚本流式传输数据(Hive"转换"),并且您希望脚本在特定的组和顺序中处理您的数据。为此,您可以使用DISTRIBUTE BY + SORT BYCLUSTER BY。使用DISTRIBUTE BY可以确保您将整个组放在同一个reducer中。使用SORT BY,您可以持续获取群组的所有记录。

答案 1 :(得分:1)

除了@ Dudu的答案之外, Distribute By 仅在reducers之间分配行,这些行是根据输入大小确定的。

用于Hive作业的缩减器数量将由此属性hive.exec.reducers.bytes.per.reducer确定,该属性取决于输入。

从Hive 0.14开始,如果输入是< 256 MB ,只会使用一个减速器(每256MB输入一个减速器),除非减速器的数量被hive.exec.reducers.maxmapred.reduce.tasks属性覆盖。