嗨,我有点陷入某种逻辑,并想知道是否有人可以给我一个提示。我试图根据多个列不为空来过滤行。我的第一个想法是这样的:
B = FILTER A BY $8!='' AND $9!='' AND $10!='' AND $11!='';
但后来我才意识到会过滤掉一些是空的行,但不是全部。就像$8
和$9
为空,但$10
和$11
不为空,它们会在我的示例中被滤除,但我不想要。我只想删除所有$8
,$9
,$10
,$11
= null的行。我确信这是一件很简单的事情,我只是没有看到,但我已经尝试了很多并且谷歌搜索了很多但仍然感到困惑。谢谢。
答案 0 :(得分:0)
首先要了解您的数据是否包含空字符串或空值。 Null在Pig中具有特殊含义,并且与空白相同。要测试空值,您可以使用IS NULL
和IS NOT NULL
代替== ''
和!= ''
。每当您尝试对空值使用常规比较运算符(如==
,>
等)时,结果为null而不是true / false。如果您尝试过滤,则会过滤掉任何导致null的比较。 (例如,var != "apple"
过滤掉var
为apple
的所有行和 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);