如何使用 apache pig 将一个包转换为多个包?

Posted

技术标签:

【中文标题】如何使用 apache pig 将一个包转换为多个包?【英文标题】:How to convert a bag into multiple bags using apache pig? 【发布时间】:2016-12-15 22:20:55 【问题描述】:

我有一个包含两组数据的文件,如下所示:

1,abc,10,dss
2,efgh,as
1,abc,10,1234
2,efgh,as
1,abc,10,7899
2,efgh,as

以#1 开头的记录是一组,以#2 开头的记录是不同的一组。所以两者都有不同的结构。如何分离这两组记录?

【问题讨论】:

【参考方案1】:

这是一种方法……

A = LOAD '/user/data/split.txt' as line:chararray;
B  = FOREACH A GENERATE  Flatten(TOKENIZE(line,' ')) ;
B1 = filter B by $0  matches '1.*';
B2 = filter B by $0  matches '2.*';
DUMP B1
DUMP B2
 or 
 SPLIT B INTO B1 IF ($0  matches '1.*'), B2 IF ($0  matches '2.*');

【讨论】:

嗨,我收到以下错误:2016-12-16 10:32:17,936 [main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1025: 无效的字段投影。投影字段 [line] 不存在。我运行了以下代码:grunt> file2 = LOAD '/hls/hls_wi/training/twofile.csv' USING PigStorage(',') ; grunt> B = FOREACH file2 GENERATE Flatten(TOKENIZE(line,' ')) ; 您正在使用“USING PigStorage(',') ;”就地使用“as line:chararray;”和 TOKENIZE 并确认您的输入格式。【参考方案2】:

使用新的更新版本的输入,这里是其他解决方案

A = LOAD '/user/data/split.txt' as line:chararray;
B1 = filter A by $0  matches '1.*';
B2 = filter A by $0  matches '2.*';
or 
SPLIT A INTO B1 IF ($0  matches '1.*'), B2 IF ($0  matches '2.*');

【讨论】:

以上是关于如何使用 apache pig 将一个包转换为多个包?的主要内容,如果未能解决你的问题,请参考以下文章

将键值元组包转换为 Apache Pig 中的映射

如何使用 apache pig 将标题行加入多个文件中的详细行

数据正在转换为二进制格式,同时使用 Apache pig 将数据加载到 monet db

无法将 org.apache.pig.builtin.SUM 的匹配函数推断为多个匹配或都不匹配。请使用显式演员表

如何从 Apache Pig 中的文件中读取多个文件?

使用 pig 生成最大数量