当值为 NULL 时,Apache Pig 不遵守 ELSE 语句
Apache Pig doesn't respect ELSE statement when value is NULL
在 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 检查,但它在脚本中增加了很多膨胀。
不幸的是,这是设计使然,是的。在 Pig 中,几乎每个处理 NULL 的表达式都会产生 NULL,因此您应该始终在代码中检查这些值。 the official documentation.
中有一个 NULL 会发生什么的列表
Arithmetic operators: If either subexpression is null, the resulting expression is null.
- , -, *, /
- % modulo
- ? : bincond
- CASE : case
最好的解决方法就是您所说的,使用 is null
和 is not null
运算符检查 NULL。当存在许多空值的可能性时,您会生成混乱的代码行,但不幸的是,目前没有其他解决方案。
在 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 检查,但它在脚本中增加了很多膨胀。
不幸的是,这是设计使然,是的。在 Pig 中,几乎每个处理 NULL 的表达式都会产生 NULL,因此您应该始终在代码中检查这些值。 the official documentation.
中有一个 NULL 会发生什么的列表Arithmetic operators: If either subexpression is null, the resulting expression is null.
- , -, *, /
- % modulo
- ? : bincond
- CASE : case
最好的解决方法就是您所说的,使用 is null
和 is not null
运算符检查 NULL。当存在许多空值的可能性时,您会生成混乱的代码行,但不幸的是,目前没有其他解决方案。