0

我在许多子目录中有很多文件,所有文件都以逗号分隔。我想按每个文件中的第一个字段分组并运行总记录数

A = LOAD '/files/*' USING PigStorage(',') as (f1, f2, f3, f4, f5);
B = GROUP A ALL;
C = GROUP B BY f1;
D = FOREACH C GENERATE COUNT(f1) ;
DUMP D;

这段代码给了我错误

无效的场投影。架构中不存在投影字段 [f1]:group:chararray,A:bag{:tuple(f1:chararray,f2:bytearray,f3:bytearray,f4:bytearray,f5:bytearray)}。

4

2 回答 2

0

COUNT 函数采用 BAG 的名称而不是字段的名称。它应该是:

D = FOREACH C GENERATE COUNT(B) ;
于 2013-10-18T14:45:49.837 回答
0

你不需要做一个GROUP BY ALL

问题是您正在尝试按 f1 对 B 组进行分组。f1 在 B 中不存在。

A = LOAD '/files/*' ...
B = GROUP A BY f1;
C = FOREACH B GENERATE COUNT(A);
DUMP C;

试试看。

Group by all 仅在您要计算整个数据集时使用。应该非常小心地使用 Group by all,因为如果不小心,所有数据都将在单个 reduce 任务中处理。

于 2013-10-18T15:40:56.520 回答