猪拉丁放松等于==与null?

时间:2012-06-11 04:51:20

标签: null apache-pig latin nvl

在关系X中只有1行

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

现在我想做:

Y = FILTER X BY A != B ;

我打算说由于A为空且B不为,因此条件应该为真。 但实际结果是Y为空,条件评估为假。

这与SQL相同,其中涉及null的任何条件都为false。而SQL可以翻译 使用NVL()函数null,PIG似乎没有那个,有没有一种干净的方法来进行上述比较?

2 个答案:

答案 0 :(得分:2)

这有点像黑客,但您可以进行比较并将结果存储在您的关系中,然后使用结果和原始比较进行过滤。

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)

答案 1 :(得分:0)

我安装了猪版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