当值为 NULL 时,Apache Pig 不尊重 ELSE 语句

Posted

技术标签:

【中文标题】当值为 NULL 时,Apache Pig 不尊重 ELSE 语句【英文标题】:Apache Pig doesn't respect ELSE statement when value is NULL 【发布时间】:2015-06-15 09:28:20 【问题描述】:

在 Apache Pig 中检查 CASE 语句中的值时,当条件中的一个值为 NULL 时,ELSE 例程将被忽略。

因此在下面的示例中,当 A 或 B 为 NULL 值时,A_equals_B 在输出中将为 NULL 而不是 0。

input = LOAD '/data/input.csv' USING PigStorage() AS (A:chararray, B:chararray);
output = FOREACH input GENERATE
    CASE
        WHEN A == B THEN 1
        ELSE 0
    END AS A_equalsB;

这是设计使然吗?这些问题的最佳解决方法是什么?我单独添加了对 NULL 的检查,但它在脚本中增加了很多臃肿。

【问题讨论】:

【参考方案1】:

不幸的是,这是设计使然,是的。在 Pig 中,几乎每个处理 NULL 的表达式都会导致 NULL,因此您应该始终在代码中检查这些值。在the official documentation 中有一个关于 NULL 会发生什么的列表。

算术运算符:如果任一子表达式为空,则结果表达式为空。

、-、*、/ % 模数 ? : bincond 案例:案例

最好的解决方法就是您所说的,使用is nullis not null 运算符检查NULL。当存在许多空值的可能性时,您会生成凌乱的代码行,但不幸的是目前没有其他解决方案。

【讨论】:

以上是关于当值为 NULL 时,Apache Pig 不尊重 ELSE 语句的主要内容,如果未能解决你的问题,请参考以下文章

当值为空时获取计数

当值设置为 null 时,幕后会发生啥?

Apache Pig:用字符串替换 null

当值为“null”时,Jackson 忽略自定义字段反序列化器

无法在 Apache Pig 中过滤 NULL 值

仅当值不同时才更新 HBase 表