pig latin relaxed equals==带null?

nbysray5  于 2021-06-21  发布在  Pig
关注(0)|答案(2)|浏览(486)

在只有一行的关系x中

X.A=null
X.B= "blahblah"

现在我想做:

Y = FILTER X BY A != B ;

我想说,既然a是空的,而b不是,那么条件应该是真的。但实际结果是y为空,条件的计算结果为false。
这与sql相同,其中任何涉及null的条件都是false。虽然sql可以用nvl()函数转换null,但pig似乎没有,有没有一种干净的方法来进行上述比较?

oknwwptz

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.

dfddblmv

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)

相关问题