Hadoop 蜂巢计数与UDAF2不同

Hadoop 蜂巢计数与UDAF2不同,hadoop,hive,Hadoop,Hive,我读了这么多: 我遇到了一个配置单元查询,它在不分组的情况下计算计数, 它跑得很慢。所以我想知道这个功能如何 在Hive中实现,有UDAFCountDistinct吗 答案是: 要实现计数不同,配置单元依赖于GenericUDAFCount。那里 没有为count distinct专门实现UDAF。那些 “distinct by”键将是的分区键的一部分 MapReduce洗牌阶段,通过这种方式,它们非常“独特” 自然的 根据您的情况,它运行缓慢,因为只有一个 reducer可以处理大量的详细数据

我读了这么多:

我遇到了一个配置单元查询,它在不分组的情况下计算计数, 它跑得很慢。所以我想知道这个功能如何 在Hive中实现,有UDAFCountDistinct吗

答案是:

要实现计数不同,配置单元依赖于GenericUDAFCount。那里 没有为count distinct专门实现UDAF。那些 “distinct by”键将是的分区键的一部分 MapReduce洗牌阶段,通过这种方式,它们非常“独特” 自然的

根据您的情况,它运行缓慢,因为只有一个 reducer可以处理大量的详细数据。您可以使用分组方式 在计数以获得更多并行性之前:

但是我不明白一些事情:

  • 回答者所说的“那些‘distinct by’键将是MapReduce Shuffle阶段分区键的一部分”是什么意思?你能解释一下吗
  • 为什么在这种情况下只有一个减速器
  • 为什么奇怪的内部查询会导致更多分区
  • 我会尽力解释的

    第1部分:

    回答者所说的“那些‘distinct by’键将是MapReduce Shuffle阶段分区键的一部分”是什么意思?你能解释一下吗? UDAF
    GenericUDAFCount
    能够同时进行
    count
    count distinct
    。它是如何实现
    计数不同的

    让我们以以下查询为例:

    选择类别,按类别从市场组中统计(不同品牌);
    
    将为此查询启动一个MapReduce作业

    distinct by
    键是
    count(distinct…
    中的表达式(列),在本例中为
    brand

    分区依据
    键是用于在
    映射
    阶段为记录计算哈希代码的字段。然后,此哈希值用于决定记录应该去哪个分区。通常,
    分区依据
    键位于SQL查询的
    分组依据
    部分。在这种情况下,它是
    类别

    映射器的实际
    输出键
    将由
    键划分和
    键区分组成。对于上述情况,映射器的输出键可能类似于(饮料、百事可乐)

    此设计使具有相同
    分组键的所有行落入同一个减速机中

    映射器输出的
    部分在这里并不重要

    稍后在洗牌阶段,将根据
    排序依据
    键对记录进行排序,这与
    输出键
    相同

    然后在
    reduce
    阶段,在每个单独的reducer中,所有记录首先按类别然后按品牌进行排序。这使得很容易获得
    count(distinct)
    聚合的结果。每个distinct(category,brand)对保证只处理一次。聚合已变成
    count(*)
    在每个组中。调用
    reduce
    方法的输入键将是这些不同的键对之一。Reducer进程跟踪合成键。每当类别部分发生变化时,我们都知道新的组已经出现,并开始从1开始计算该组

    第二部分:

    为什么在这种情况下只有一个减速器? 计算
    count distinct
    时,不使用
    group by
    如下:

    从市场中选择计数(不同品牌)
    
    将只有一个减缩器承担所有的工作。为什么?因为
    键划分的分区不存在,或者我们可以说所有记录都具有相同的哈希代码。因此它们将属于相同的减缩器

    第三部分:

    为什么奇怪的内部查询会导致更多分区

    内部查询的
    分区依据
    键是
    分组依据
    键,
    id
    。有可能
    id
    值分布相当均匀,因此记录由许多不同的还原器处理。然后在内部查询之后,可以安全地得出结论,所有
    id
    都是彼此不同的。所以现在只需要一个简单的计数(1)

    但请注意,输出将只启动一个减缩器。为什么它不会受到影响?因为
    count(1)
    不需要详细的值,映射端聚合大大减少了减缩器处理的数据量。
    还有一件事,这种重写不能保证表现更好,因为它引入了一个额外的MR阶段

    select count(1) from (select id from tbl group by id) tmp;