PIG过滤掉列数不正确的行

时间:2015-03-15 18:20:03

标签: apache-pig filtering

我在 a

中加载了简单的数据
dump a

ahoeh,1,e32
hello,2,10
ho,3

我需要过滤掉所有不同于3的列/字段数的行。怎么做? 换句话说,结果应该是:

dump results

ahoeh,1,e32
hello,2,10

我知道应该有一个FILTER内置函数。但是我无法弄清楚应该定义什么条件(列数= 3)。

谢谢!

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)})返回2COUNT_STAR({(1),(),(3)})返回3

答案 2 :(得分:0)

我看到两种方法: 首先,您可以重新编写我认为的过滤器,因为它归结为:给我所有不包含NULL值的行。对于许多列,编写此过滤器语句相当繁琐。

其次,您可以使用TOBAG(http://pig.apache.org/docs/r0.12.1/func.html#tobag)将每列的列转换为一个包,然后编写一个处理输入包的UDF,以检查此包中的空元组并返回true或false并使用这在过滤器声明中。

无论哪种方式,我认为需要一些乏味。