配置单元中的distribute by子句

zrfyljdw  于 2021-06-26  发布在  Hive
关注(0)|答案(2)|浏览(3423)

我不明白这是怎么回事 DISTRIBUTE BY 子句在Hive中不起作用。我知道这个定义,如果我们有 DISTRIBUTE BY (city) ,这将使每个城市在不同的减速器,但我不是得到相同的。让我们考虑以下数据:
假设我们有一个名为data的表,其中包含username和amount列:

+----------+--------+
| 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      |
+----------+--------+

现在如果我说-

SELECT username, SUM(amount) FROM data DISTRIBUTE BY (username)

这不是应该运行两个单独的减速器吗?它仍在运行一个减速机,我不知道为什么。我认为这可能与集群到bucket或分区有关,但我尝试了所有方法,它仍然运行一个reducer。有人能解释为什么吗?

osh3o9ms

osh3o9ms1#

除了@dudu的答案之外,distribute by只在由输入大小决定的减速器之间分配行。
用于配置单元作业的减速器数量将由此属性确定 hive.exec.reducers.bytes.per.reducer 这取决于输入。
从配置单元0.14开始,如果输入小于256mb,则仅使用一个减速机(每256mb输入一个减速机),除非减速机的数量被 hive.exec.reducers.max 或者 mapred.reduce.tasks 属性。

pdkcd3nj

pdkcd3nj2#

唯一的事情 DISTRIBUTE BY (city) 上面说的是同一张唱片 city 将转到同一个减速器。没别的了。
hive使用distribute by中的列在缩减器之间分布行。具有相同distribute by columns的所有行将转到相同的reducer
https://cwiki.apache.org/confluence/display/hive/languagemanual+sortby
op的一个问题:
那么,这种分配方式有什么意义呢?不能保证每个城市都会使用不同的减速器,那为什么要使用它呢?
原因有二:
在Hive的开始 DISTRIBUTE BY , SORT BY 以及 CLUSTER BY 用于以今天自动完成的方式处理数据的位置(例如,分析函数https://oren.lederman.name/?p=32)
您可能希望通过脚本(hive“transform”)流式传输数据,并希望脚本按特定的组和顺序处理数据。你可以用 DISTRIBUTE BY + SORT BY 或者 CLUSTER BY . 与 DISTRIBUTE BY 这是保证你会有整个小组在同一个减速器。与 SORT BY 你会连续得到一组人的所有记录。

相关问题