在Pig中,获得计数的有效方法是什么?我们可以做一个GROUP ALL,但这只给了1个reducer。当数据量非常大时,比如n太字节,我们能以某种方式尝试多个减速器吗?
dataCount = FOREACH (GROUP data ALL) GENERATE
'count' as metric,
COUNT(dataCount) as value;
答案 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任务)。