Cou*_*000 5 sql hadoop hive nan hue
我在Hue中运行一个配置单元表的求和函数,并获得NaN的返回值。
这是我的代码:
select sum(v1) from hivedb.tb1;
我不知道为什么它会给我NaN结果。我检查了我的任何v1值是否为空:
select * from hivedb.tb1 where v1 is null;
,结果是没有记录具有空值。该表有1亿行,因此我无法手动检查每条记录。
任何帮助表示赞赏。先感谢您!
UPDATE 1 我手动筛选了前1000行,幸运的是在tb1中发现了NaN的一些异常值。这是由于先前步骤中的一些舍入错误造成的。因此,我的问题1可能得到了回答。如果您认为还有其他原因,请随时对此发表评论。
我仍然不知道如何使用一种有效的方法来发现具有NaN值的行。因此,我仍然期待对问题2的任何回答。请随时分享。我感谢您的帮助。
更新2 在下面的“讨论”部分中,通过已接受的答案可以解决该问题。有多种处理方法。
Hive依赖于Java (以及Null和friends的SQL特定语义),Java遵循IEEE数字语义标准。这意味着... NaN很棘手。
引用该帖子 ...
(Float.NaN == Float.NaN)
始终返回false。
实际上,如果您看一下JDK的实现Float.isNaN()
,则数字如果不等于其自身,则不是数字(这是有道理的,因为数字应等于其自身)。
Double.NaN同样适用
因此,向您展示如何使用称为的(未记录)Hive函数毫无意义reflect2
,它允许您在Hive列上调用原始Java方法,即
where v1 is not null and not reflect2(v1, "isNaN")
Run Code Online (Sandbox Code Playgroud)
...因为-从理论上讲-您可以简单地声明:
where v1 is not null and v1=v1
Run Code Online (Sandbox Code Playgroud)
免责声明 -我见过Hive优化器进行激进的“优化”并产生错误结果的情况。
换句话说,如果simplev1=v1
子句不能按预期方式过滤掉NaN值,请查看reflect2
...
编辑 -实际上,优化器似乎忽略了v1=v1
Hive的某些版本中的子句(请参见注释),因此需要一个更弯曲的公式:
v1 +1.0 > v1
应该工作...除非四舍五入错误使abs(v1)
<< 1或abs(v1)
>> 1v1 =0.0
最后,似乎尝试了最可靠的方法(因为所有可能的NaN值都显示为“ NaN”,即使它们在算术意义上不是严格“相等”的)。cast(v1 as String) <>'NaN'
reflect2
-您可以看到,在Hive官方文档中确实没有提到它,而reflect
提到了它(甚至有特定的Wiki条目)。但是它早在Hive V0.11 cf中就已实现。蜂巢4025
编辑 -现在,默认情况下,对于ODBC / JDBC / Hue连接,Java“反射”是默认禁用的(请参见注释),并且在使用安全性插件(例如Ranger或Sentry)时无法重新启用。因此,它的使用仅限于(不建议使用的)hive
CLI。
归档时间: |
|
查看次数: |
7966 次 |
最近记录: |