A = LOAD 'input' AS (line:chararray);
B = FOREACH A GENERATE FLATTEN(STRSPLIT(line,','));
C = FOREACH B GENERATE COUNT(TOBAG(*)),$0..;
D = FILTER C BY $0==3;
E = FOREACH D GENERATE $1..;
DUMP E;
pigscript2:脚本2:
A = LOAD 'input' USING PigStorage(',');
B = FOREACH A GENERATE COUNT(TOBAG(*)),$0..;
C = FILTER B BY (int)$0==3;
D = FOREACH C GENERATE $1..;
DUMP D;
3条答案
按热度按时间mi7gmzs61#
你能试试这个吗?
输入
pigscript1:脚本1:
pigscript2:脚本2:
输出:
8aqjt8rx2#
(看来我没有足够的业力来评论;这就是为什么这是一个新的答案张贴。)
如果null/empty string是有效的字段值,则接受的答案的行为与预期不太一样;你需要使用
COUNT_STAR
而不是COUNT
计算架构中的空/空字段。请参见:https://pig.apache.org/docs/r0.9.1/func.html#count-星
例如,给定以下输入数据:
还有这个Pig剧本:
这个
filtered
别名将包含这两行。不同的是COUNT({(1),(),(3)})
退货2
而COUNT_STAR({(1),(),(3)})
退货3
.raogr8fs3#
我看到了两种方法:首先,您可以重新表述我认为的过滤器,因为它归结为:给我所有不包含空值的行。对于许多列来说,编写这个filter语句相当乏味。
其次,您可以使用tobag将列转换为每行一个包(http://pig.apache.org/docs/r0.12.1/func.html#tobag)然后编写一个udf来处理输入包,以检查该包中的空元组,并返回true或false,并在filter语句中使用它。
不管怎样,我认为需要一些乏味的东西。