处理impala中的NULL数据

时间:2017-10-12 18:24:05

标签: hive impala

我正在尝试了解impala中算术运算的行为

我正在使用下表

╔════╦══════════════╦══════════╗
║ id ║  name        ║ salary   ║
╠════╬══════════════╬══════════╣
║  1 ║  cde         ║ 5636     ║
║  2 ║  asd         ║  148     ║
║  3 ║  pwe         ║  null    ║
║  4 ║  lmn         ║  959     ║
╚════╩══════════════╩══════════╝

当我执行以下查询

select salary+20 as sum1 from table where id=3;

它让我回头

     |sum1
  ---|-----
   1 |NULL

当我使用

在列上运行总和时
select sum(salary) as sum1 from table;

     |sum1
  ---|-----
   1 |6743

我无法理解相同的算术运算如何表现不同

3 个答案:

答案 0 :(得分:2)

你有没有试过像:

select sum(COALESCE(salary,0)) as sum1 from table;

这应该确保返回的值是一个数字。类似于leftjoin的回答。您也可以使用case语句或where语句来执行此操作。

来源:

https://www.cloudera.com/documentation/enterprise/5-4-x/topics/impala_conditional_functions.html

答案 1 :(得分:0)

这些是不同的算术查询。

在第一个查询中,您希望数据库从第3行返回salary+20。第3行的salaryNULL。因此,数据库会看到NULL+20=NULL并返回NULL

但是在第二个查询中:sum(salary) from table;要求数据库对整个salary列求和并将其返回给您。所以它会查看它并5636+148+959=6743(忽略NULL)。

总之,在第一个查询中,您正在执行一个基本算术运算符。但第二个查询sum()是一个应用于返回行的运算符。作为一个更好的测试,尝试运行select sum(salary) as sum1 from table where id=3,看看你能做些什么来更好地了解正在发生的事情。

答案 2 :(得分:0)

NULL不是零(0),零不是NULL,它是一个值,这是最重要的。 NULL是缺少值,没有。 sum()仅聚合值。如果数据集中没有任何值,则返回NULL。如果它是某些值,sum()将聚合它们,忽略空值。如果您想将NULL转换为零,请使用NVL()函数:

select nvl(sum(salary),0) as sum1 from table where ...

如果数据集中没有值,此查询将返回0.