我正在运行Hive1.1.0,看两个小时 bigint 柱, active_users 以及 inactive_users , SUM(active_users + inactive_users) < SUM(active_users) + SUM(inactive_users) .为什么会这样,因为它应该是一个简单的整数加法?
bigint
active_users
inactive_users
SUM(active_users + inactive_users)
SUM(active_users) + SUM(inactive_users)
vx6bjr1n1#
当一个而不是两个值都是 NULL .因此,请考虑:
NULL
a b 1 1 2 NULL NULL 3
那么 sum(a) + sum(b) 是以下各项的总和: (1 + 2) 以及 (1 + 3) = 7. 这个 NULL 被忽略。然而, sum(a + b) 是以下各项的总和:
sum(a) + sum(b)
(1 + 2)
(1 + 3)
sum(a + b)
(1 + 1) (2 + NULL) (NULL + 3)
其计算结果为:
2 NULL NULL
这个 NULL s被忽略,因此结果是2。换句话说, SUM() 忽略 NULL 价值观,但是 + 不。
SUM()
+
j91ykkif2#
有两种可能性:1) 不处理 NULL 值(如果列可为null)
SUM(active_users + inactive_users) SUM(active_users) + SUM(inactive_users) -- should be SUM(COALESCE(active_users,0) + COALESCE(inactive_users,0)) SUM(COALESCE(active_users,0)) + SUM(COALESCE(inactive_users,0))
2) 如果列具有不精确的数据类型,如 FLOAT 舍入误差可能累积。更多信息:平均浮动不一致
FLOAT
2条答案
按热度按时间vx6bjr1n1#
当一个而不是两个值都是
NULL
.因此,请考虑:
那么
sum(a) + sum(b)
是以下各项的总和:(1 + 2)
以及(1 + 3)
= 7. 这个NULL
被忽略。然而,
sum(a + b)
是以下各项的总和:其计算结果为:
这个
NULL
s被忽略,因此结果是2。换句话说,
SUM()
忽略NULL
价值观,但是+
不。j91ykkif2#
有两种可能性:
1) 不处理
NULL
值(如果列可为null)2) 如果列具有不精确的数据类型,如
FLOAT
舍入误差可能累积。更多信息:平均浮动不一致