在 Pig 中,获取计数的有效方法是什么?我们可以做一个 GROUP ALL,但是只给了 1 个 reducer。当数据量很大时,比如 n TB,我们可以尝试多个 reducer 吗?
dataCount = FOREACH (GROUP data ALL) GENERATE
'count' as metric,
COUNT(dataCount) as value;
在 Pig 中,获取计数的有效方法是什么?我们可以做一个 GROUP ALL,但是只给了 1 个 reducer。当数据量很大时,比如 n TB,我们可以尝试多个 reducer 吗?
dataCount = FOREACH (GROUP data ALL) GENERATE
'count' as metric,
COUNT(dataCount) as value;
GROUP ALL
您可以将其分为两个步骤,而不是直接使用 a 。首先,按某个字段分组并计算行数。然后,执行 aGROUP 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)
我只是在这个主题中挖掘了更多内容,如果您使用的是最新的 pig 版本,您似乎不必担心单个 reducer 将不得不处理大量数据。代数 UDF-s 将智能处理 COUNT,并在映射器上计算。所以reducer只需要处理聚合数据(计数/映射器)。我认为它是在 0.9.1 中引入的,但0.14.0肯定有
代数接口
聚合函数是一个 eval 函数,它接受一个包并返回一个标量值。许多聚合函数的一个有趣且有用的特性是它们可以以分布式方式增量计算。我们称这些函数为代数函数。COUNT 是代数函数的一个示例,因为我们可以计算数据子集中元素的数量,然后将计数相加以产生最终输出。在 Hadoop 世界中,这意味着部分计算可以由 map 和 combiner 完成,最终结果可以由 reducer 计算。
但我之前的回答肯定是错误的:
在分组中,您可以使用
PARALLEL n
关键字 this 设置减速器的数量。通过指定 reduce 任务的数量 n 来增加作业的并行度。n 的默认值为 1(一个 reduce 任务)。