行中所有列的过滤不等于null(pig)

时间:2018-03-17 16:50:45

标签: apache-pig

嗨,我有点陷入某种逻辑,并想知道是否有人可以给我一个提示。我试图根据多个列不为空来过滤行。我的第一个想法是这样的:

B = FILTER A BY $8!='' AND $9!='' AND $10!='' AND $11!='';

但后来我才意识到会过滤掉一些是空的行,但不是全部。就像$8$9为空,但$10$11不为空,它们会在我的示例中被滤除,但我不想要。我只想删除所有$8$9$10$11 = null的行。我确信这是一件很简单的事情,我只是没有看到,但我已经尝试了很多并且谷歌搜索了很多但仍然感到困惑。谢谢。

1 个答案:

答案 0 :(得分:0)

首先要了解您的数据是否包含空字符串或空值。 Null在Pig中具有特殊含义,并且与空白相同。要测试空值,您可以使用IS NULLIS NOT NULL代替== ''!= ''。每当您尝试对空值使用常规比较运算符(如==>等)时,结果为null而不是true / false。如果您尝试过滤,则会过滤掉任何导致null的比较。 (例如,var != "apple"过滤掉varapple 的所有行和 var为空的所有行。)

要查看数据中的内容,请尝试:

B = FILTER A BY $8 == '';
C = LIMIT B 10;
DUMP;

还有:

B = FILTER A BY $8 IS NULL;
C = LIMIT B 10;
DUMP;

如果你从第一个得到结果,你就有空白。如果从第二个得到结果,则为空。

要回答您的问题,如果您有空白,可以使用此选项删除所有指定字段为空的行:

B = FILTER A BY NOT ($8 == '' AND $9 == '' AND $10 == '' AND $11 == '');

如果您有空值,则可以使用:

B = FILTER A BY NOT ($8 IS NULL AND $9 IS NULL AND $10 IS NULL AND $11 IS NULL);