在只有一行的关系x中
X.A=null X.B= "blahblah"
现在我想做:
Y = FILTER X BY A != B ;
我想说,既然a是空的,而b不是,那么条件应该是真的。但实际结果是y为空,条件的计算结果为false。这与sql相同,其中任何涉及null的条件都是false。虽然sql可以用nvl()函数转换null,但pig似乎没有,有没有一种干净的方法来进行上述比较?
oknwwptz1#
我已经安装了pig版本0.12.1;实际上,我可以直接写条件:
Y = filter X by (A is null and B is not null) or (A is not null and B is null) or A != B;
注意,对于null/null情况,表达式a!=b的计算结果为null,因此过滤器排除元组,根据http://pig.apache.org/docs/r0.12.1/basic.html#nulls.
dfddblmv2#
这是一个有点黑客,但你可以做一个比较,结果存储在你的关系,然后过滤使用结果和你原来的比较。
Y = foreach X generate *, (((A is null and B is not null) or (A is not null and B is null) ? 'y' : 'n') as oneNull; Y = filter Y by (oneNull == 'y' or A != B); Y = foreach Y generate A, B;
如果x是:
(,blahblah) (blah,blah) (,) (blah,) (abc,def)
那么y将是:
(,blahblah) (blah,) (abc,def)
2条答案
按热度按时间oknwwptz1#
我已经安装了pig版本0.12.1;实际上,我可以直接写条件:
注意,对于null/null情况,表达式a!=b的计算结果为null,因此过滤器排除元组,根据
http://pig.apache.org/docs/r0.12.1/basic.html#nulls.
dfddblmv2#
这是一个有点黑客,但你可以做一个比较,结果存储在你的关系,然后过滤使用结果和你原来的比较。
如果x是:
那么y将是: