свиная латынь расслабленная равна == с нулем?

в отношении X только с 1 строкой

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

теперь я хочу сделать:

Y = FILTER X BY A != B ;

Я хотел сказать, что, поскольку A равно null, а B нет, условие должно быть истинным. но фактический результат состоит в том, что Y пусто, и условие оценивается как ложное.

это то же самое, что и SQL, где любое условие, включающее null, ложно. в то время как SQL может переводить null с помощью функции NVL(), у PIG, похоже, этого нет, есть ли чистый способ сделать приведенное выше сравнение?


person teddy teddy    schedule 11.06.2012    source источник


Ответы (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)
person cyang    schedule 27.07.2012

У меня установлена ​​версия 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.

person stefan.schroedl    schedule 28.05.2015