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

af7jpaap  于 2021-06-25  发布在  Pig
关注(0)|答案(2)|浏览(361)

在pig中,什么是获得计数的有效方法?我们可以做一组所有,但这是只有一个减速机。当数据量非常大的时候,比如说n兆字节,我们可以尝试多个缩减器吗?

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

e0bqpujr1#

而不是直接使用 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)
pbossiut

pbossiut2#

我只是在这个主题中多挖掘了一点,如果您使用的是最新的pig版本,您似乎不必担心单个reducer将不得不处理大量的数据。代数udf-s将智能处理计数,并在Map器上进行计算。因此,reducer只需处理聚合数据(counts/mapper)。我认为它是在0.9.1中引入的,但是0.14.0肯定有
代数界面
聚合函数是一个eval函数,它接受一个包并返回一个标量值。许多聚合函数的一个有趣且有用的特性是,它们可以以分布式方式递增计算。我们称这些函数为代数函数。count是代数函数的一个例子,因为我们可以对数据子集中的元素数进行计数,然后对计数求和以生成最终输出。在hadoop世界中,这意味着部分计算可以由map和combiner完成,最终结果可以由reducer计算。
但我之前的回答肯定是错的:
在分组中,可以使用 PARALLEL n 关键字设置减速器的数量。
通过指定reduce任务的数量来增加作业的并行性。n的默认值是1(一个reduce任务)。

相关问题