pig过滤出列数不正确的行

6jjcrrmo  于 2021-06-25  发布在  Pig
关注(0)|答案(3)|浏览(433)

我将简单数据加载到:

dump a

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

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

dump results

ahoeh,1,e32
hello,2,10

我知道应该有一个内置的过滤器功能。但是我不知道应该定义什么条件(列数=3)。
谢谢!

mi7gmzs6

mi7gmzs61#

你能试试这个吗?
输入

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:脚本1:

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;

输出:

(ahoeh,1,e32)
(hello,2,10)
(3,te,0)
(aa,3,b)
(y,h,3)
(3,3,3)
8aqjt8rx

8aqjt8rx2#

(看来我没有足够的业力来评论;这就是为什么这是一个新的答案张贴。)
如果null/empty string是有效的字段值,则接受的答案的行为与预期不太一样;你需要使用 COUNT_STAR 而不是 COUNT 计算架构中的空/空字段。
请参见:https://pig.apache.org/docs/r0.9.1/func.html#count-星
例如,给定以下输入数据:

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 .

raogr8fs

raogr8fs3#

我看到了两种方法:首先,您可以重新表述我认为的过滤器,因为它归结为:给我所有不包含空值的行。对于许多列来说,编写这个filter语句相当乏味。
其次,您可以使用tobag将列转换为每行一个包(http://pig.apache.org/docs/r0.12.1/func.html#tobag)然后编写一个udf来处理输入包,以检查该包中的空元组,并返回true或false,并在filter语句中使用它。
不管怎样,我认为需要一些乏味的东西。

相关问题