HIVE中的DISTRIBUTE BY条款

Use*_*523 7 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      |
+----------+--------+
Run Code Online (Sandbox Code Playgroud)

假设我们有一个包含用户名数量列的TABLE数据.

现在,如果我说 -

select username,sum(amount) from data DISTRIBUTE by (name)
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*itz 7

唯一DISTRIBUTE BY (city)说的是具有相同记录的记录city将转到相同的reducer.没有其他的.

Hive使用Distribute By中的列在reducers之间分配行.具有相同Distribute By列的所有行将转到相同的reducer

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


OP提出的问题:

那么DISTRIBUTE BY有什么意义呢?不能保证每个(城市)会使用不同的减速器然后使用它吗?


有两个原因:

  1. 在hive的开头DISTRIBUTE BY,SORT BY以及CLUSTER BY用于以今天自动完成的方式处理数据的地方(例如分析函数https://oren.lederman.name/?p=32)

  2. 您可能希望通过脚本(Hive"转换")流式传输数据,并且您希望脚本在特定组和顺序中处理您的数据.为此你可以使用DISTRIBUTE BY+ SORT BYCLUSTER BY.有了DISTRIBUTE BY它保证了你必须在整个集团同样减速.有了SORT BY它,你将不断获得一组的所有记录.

  • 也没有.映射器正在读取的每个记录都被复制到其中一个reducers,由Hash函数决定的分配值,在本例中为"city",这只发生在reducers的数量之后.正在决定. (2认同)

fra*_*ijo 5

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

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

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