在Pig中计算行数的有效方法是什么?

时间:2015-05-11 23:27:57

标签: apache-pig reducers

在Pig中,获得计数的有效方法是什么?我们可以做一个GROUP ALL,但这只给了1个reducer。当数据量非常大时,比如n太字节,我们能以某种方式尝试多个减速器吗?

  dataCount = FOREACH (GROUP data ALL) GENERATE 
    'count' as metric,
    COUNT(dataCount) as value;

2 个答案:

答案 0 :(得分:5)

您可以将其分为两个步骤,而不是直接使用GROUP ALL。首先,按一些字段分组并计算行数。然后,执行GROUP ALL来总结所有这些计数。这样,您就可以并行计算行数。

但请注意,如果您在第一个GROUP BY中使用的字段没有重复项,则结果计数将全部为1,因此不会有任何差异。尝试使用具有许多重复项的字段来提高其性能。

见这个例子:

a;1
a;2
b;3
b;4
b;5

如果我们首先按第一个字段进行分组,那么最后的COUNT将处理2行而不是5行:

A = load 'data' using PigStorage(';');
B = group A by $0;
C = foreach B generate COUNT(A);
dump C;
(2)
(3)
D = group C all;
E = foreach D generate SUM(C.$0);
dump E;
(5)

但是,如果我们按第二个分组,这是唯一的,它将处理5行:

A = load 'data' using PigStorage(';');
B = group A by $1;
C = foreach B generate COUNT(A);
dump C;
(1)
(1)
(1)
(1)
(1)
D = group C all;
E = foreach D generate SUM(C.$0);
dump E;
(5)

答案 1 :(得分:-1)

我只是在这个主题中挖掘了一下,如果您使用的是最新的猪版本,似乎您不必担心单个减速器必须处理大量数据。 代数UDF-s将处理COUNT smart,它是在mapper上计算的。因此,reducer只需要处理聚合数据(计数/映射器)。 我认为它是在0.9.1中引入的,但0.14.0肯定有它

  

代数接口

     

聚合函数是一个收集包并返回的eval函数   标量值。许多聚合的一个有趣和有用的属性   函数是它们可以在分布式中递增计算   时尚。我们将这些函数称为代数。 COUNT是一个例子   代数函数,因为我们可以计算一个元素的数量   数据的子集,然后对计数求和以产生最终输出。   在Hadoop世界中,这意味着可以进行部分计算   由地图和组合器完成,最终结果可以通过计算   减速机。

但我之前的回答肯定是错的:

  

在分组中,您可以使用此设置的PARALLEL n关键字   减速器的数量。

     
    

通过指定reduce的数量来增加作业的并行性     任务,n。 n的默认值为1(一个reduce任务)。

  
相关问题