我在 a :
中加载了简单的数据dump a
ahoeh,1,e32
hello,2,10
ho,3
我需要过滤掉所有不同于3的列/字段数的行。怎么做? 换句话说,结果应该是:
dump results
ahoeh,1,e32
hello,2,10
我知道应该有一个FILTER内置函数。但是我无法弄清楚应该定义什么条件(列数= 3)。
谢谢!
答案 0 :(得分:2)
你能试试吗?
<强>输入强>
ahoeh,1,e32
hello,2,10
ho,3
3,te,0
aa,3,b
y,h,3
3,3,3
3,3,3,1,2,3,3,,,,,,4,44,6
<强> PigScript1:强>
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:强>
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;
<强>输出:强>
(ahoeh,1,e32)
(hello,2,10)
(3,te,0)
(aa,3,b)
(y,h,3)
(3,3,3)
答案 1 :(得分:1)
(似乎我没有足够的业力来评论;这就是为什么将其作为新答案发布的原因。)
如果null / empty字符串是有效字段值,则接受的答案不会按预期运行;您需要使用COUNT_STAR
而不是COUNT
来计算架构中的空/空字段。
请参阅:https://pig.apache.org/docs/r0.9.1/func.html#count-star
例如,给定以下输入数据:
1,2,3
1,,3
和这个Pig脚本:
a = load 'input' USING PigStorage(',');
counted = foreach a generate COUNT_STAR(TOBAG(*)), $0..;
filtered = filter counted by $0 != 3;
result = foreach filtered generate $1..;
filtered
别名将包含两行。区别在于COUNT({(1),(),(3)})
返回2
而COUNT_STAR({(1),(),(3)})
返回3
。
答案 2 :(得分:0)
我看到两种方法: 首先,您可以重新编写我认为的过滤器,因为它归结为:给我所有不包含NULL值的行。对于许多列,编写此过滤器语句相当繁琐。
其次,您可以使用TOBAG(http://pig.apache.org/docs/r0.12.1/func.html#tobag)将每列的列转换为一个包,然后编写一个处理输入包的UDF,以检查此包中的空元组并返回true或false并使用这在过滤器声明中。
无论哪种方式,我认为需要一些乏味。