按多个文件分组

Posted

技术标签:

【中文标题】按多个文件分组【英文标题】:group by multiple files 【发布时间】:2013-10-18 14:42:45 【问题描述】:

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

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)。

【问题讨论】:

【参考方案1】:

你不需要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 任务中处理。

【讨论】:

【参考方案2】:

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

D = FOREACH C GENERATE COUNT(B) ;

【讨论】:

以上是关于按多个文件分组的主要内容,如果未能解决你的问题,请参考以下文章

使用linq对多个进行分组[重复]

mysql 按表达式或函数分组多个字段分组排序

LINQ - 按多个键分组未给出预期结果

LINQ 按多个字段分组 - 语法帮助

s-s-rS 按多个字段和分组分组

从表中选择多个列,但按一个分组