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