3

在只有 1 行的关系 X 中

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

现在我想做:

Y = FILTER X BY A != B ;

我的意思是,由于 A 为空而 B 不是,因此条件应该为真。但实际结果是 Y 为空,并且条件评估为假。

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

4

2 回答 2

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)
于 2012-07-27T02:10:45.440 回答
0

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

于 2015-05-28T02:00:54.047 回答