Hive 在配置单元中按子句分发

Hive 在配置单元中按子句分发,hive,hiveql,hadoop2,Hive,Hiveql,Hadoop2,我无法理解此分发方式子句在蜂巢中的作用。我知道这样的定义,如果我们有按(城市)分发,这将使每个城市使用不同的减速机,但我没有得到相同的结果。让我们考虑如下数据: 假设我们有一个名为data的表,其中包含username和amount列: 现在如果我说- SELECT username, SUM(amount) FROM data DISTRIBUTE BY (username) 这不是应该运行两个单独的减速器吗?它仍然运行一个减速器,我不知道为什么。我认为这可能与集群到bucket或分区有关,

我无法理解此
分发方式
子句在蜂巢中的作用。我知道这样的定义,如果我们有
按(城市)
分发,这将使每个城市使用不同的减速机,但我没有得到相同的结果。让我们考虑如下数据:

假设我们有一个名为data的表,其中包含username和amount列:

现在如果我说-

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

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

按(城市)分发的
唯一说明的是,具有相同
城市的记录将转到相同的还原器。没有别的了

配置单元使用“分发方式”中的列在 减速器。具有相同“分发方式”列的所有行都将转到 同一减速器


OP提出的问题:

那么,这种分配方式有什么意义呢?没有保证 每个(城市)将使用不同的减速器,那么为什么要使用它呢


原因有二:

  • 在配置单元开始时,按
  • 分发、
    排序和
    聚类,用于以今天自动完成的方式处理数据(例如,分析功能)

  • 您可能希望通过脚本(配置单元“转换”)流式传输数据,并且希望脚本以特定的组和顺序处理数据。为此,您可以使用
    +
    排序或
    聚类。使用
    distributed BY
    可以保证整个组都在同一个减速器中。使用
    排序方式
    ,您将连续获得一组的所有记录


  • 除了@Dudu的答案之外,Distribute By只在由输入大小确定的减缩器之间分配行

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


    从Hive 0.14开始,如果输入是<256MB,则只会使用一个减速机(每256MB输入一个减速机),除非减速机的数量被
    Hive.exec.reducers.max
    mapred.reduce.tasks
    属性覆盖,否则A应该使用不同的减速机,B到不同的等等?不。所有A都会到1减速器。所有的B都将被复制到1个减缩器你不能保证这些减缩器是不同的。好吧,我们可以说一次减缩器将只包含(1)种城市?也不是。映射器读取的每个记录都被复制到其中一个减缩器,由散列函数在分布值上决定,在这种情况下,
    city
    只有在确定减速器的数量后才会发生。说真的,我不明白。那么,这种分配方式有什么意义呢?无法保证每个(城市)都会使用不同的减速器,那么为什么要使用它呢?因此,如果我想为每个(城市)使用不同的减速器,我应该知道不同城市的数量,对吗?不。很明显,减速器的数量必须大于或等于城市的数量,才能使每个城市使用不同的减速器,但没有什么可以保证。这是一个散列函数,理论上你可以有10个城市和100个减缩器,但所有城市仍将在一个减缩器上。Hiii@franklinsijo都
    hive.exec.reducers.max
    mapred.reduce.tasks
    似乎不起作用。我想把reducer的数量设置为1,这样所有的文件都可以合并成一个reducer。因为,我的表没有分区,所以我无法使用
    distributed BY
    子句将单个分区的文件发送到一个reducer中。你知道我可以把减速机的数量设置为1吗??
    SELECT username, SUM(amount) FROM data DISTRIBUTE BY (username)