【发布时间】:2017-09-17 11:35:55
【问题描述】:
我在 Hue 中运行一个 hive 表的求和函数,并得到一个 NaN 的返回值。
这是我的代码:
select sum(v1) from hivedb.tb1;
我不知道为什么它给了我一个 NaN 结果。我检查了我的任何 v1 值是否为空:
select * from hivedb.tb1 where v1 is null;
,原来没有记录有空值。该表有1亿行,因此我无法对每条记录进行手动检查。
- 有人知道我为什么会得到 NaN 结果吗?
- 如果是因为我在某些行中有一些异常值,我该如何找到它们?
感谢任何帮助。提前谢谢!
更新 1 我手动筛选了前 1000 行,幸运的是在 tb1 中发现了一些 NaN 异常值。这是由于前面步骤中的一些舍入误差造成的。所以我的问题1可能已经回答了。如果您认为可能有其他原因,请随时发表评论。
我仍然不知道如何使用有效的方法来发现具有 NaN 值的行。所以我仍然期待我的问题2的任何答案。请随时分享。感谢您的帮助。
更新 2 在下面的讨论部分中接受的答案的帮助下解决了这个问题。有多种处理方法。
- 使用条件选择 v1+1 >v1。它将选择具有非 NaN 值的行。
- 使用 cast(v1 as String) ='NaN' 的条件选择。它将选择具有 NaN 值的行。
【问题讨论】:
-
哦,来吧,在计算 SQL 聚合时会忽略 Null 值。另一方面,1 亿个值的总和可能会溢出 Integer、Float 或 Decimal(p,s) 的容量。顺便问一下
v1的数据类型是什么?你试过sum(cast(v1 as Double))吗? -
@Samson Scharfrichter 你是对的。我只是不知道如何选择异常行。不过,谢谢你的其余部分。回到你的问题,v1 是双倍的。
-
@SamsonScharfrichter 谢谢。我有点想通了。一次偶然的机会,我手动筛选了数千行,幸运的是我在 tb1 中发现了一些 NaN 值。它是由一些舍入误差问题产生的。所以我的第一个问题有点回答了,即 tb1 中存在的 NaN 值。但我仍然不知道如何处理我的问题 #2。如果您有任何见解,请随时分享。