在只有 1 行的关系 X 中
X.A=null
X.B= "blahblah"
现在我想做:
Y = FILTER X BY A != B ;
我的意思是,由于 A 为空而 B 不是,因此条件应该为真。但实际结果是 Y 为空,并且条件评估为假。
这与 SQL 相同,其中任何涉及 null 的条件都是错误的。虽然 SQL 可以使用 NVL() 函数翻译 null ,但 PIG 似乎没有,有没有一种干净的方法来进行上述比较?
在只有 1 行的关系 X 中
X.A=null
X.B= "blahblah"
现在我想做:
Y = FILTER X BY A != B ;
我的意思是,由于 A 为空而 B 不是,因此条件应该为真。但实际结果是 Y 为空,并且条件评估为假。
这与 SQL 相同,其中任何涉及 null 的条件都是错误的。虽然 SQL 可以使用 NVL() 函数翻译 null ,但 PIG 似乎没有,有没有一种干净的方法来进行上述比较?
这有点小技巧,但您可以进行比较并将结果存储在您的关系中,然后使用结果和原始比较进行过滤。
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)
我安装了 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,因此过滤器会排除元组,根据