HIVE 何时将字符串隐式转换为双精度值?

Posted

技术标签:

【中文标题】HIVE 何时将字符串隐式转换为双精度值?【英文标题】:When does HIVE convert string to double implicitly? 【发布时间】:2016-01-28 08:01:55 【问题描述】:

与 HIVE 文档中的一样 https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types#LanguageManualTypes-string

HIVE 可以将 STRING 隐式转换为 DOUBLE。我有一个 HIVE 脚本,它在某些字段上连接两个表,其中有一个字段定义为 STRING。不幸的是,有两条记录,一条以“0”开头,另一条不是,但其余部分相同。这导致连接两个结果错误的表。

在“EXPLAIN SQL”中,我发现使用 UDFToDouble(field) 将此记录转换为双精度。 HIVE 进行这种隐式转换的可能情况有哪些?提高哈希/排序性能?

【问题讨论】:

【参考方案1】:

如果您的脚本包含匹配两列的 JOIN 子句,一个是 STRING,另一个是 DOUBLE,那么 Hive 必须通过将一列转换为另一列的格式来解决不匹配问题。就像在 Oracle、mysql 等中一样。

结果往往是灾难性的,因为非默认的 STRING 格式。底线:只需自行检测数据模型中的类型不匹配,并明确管理类型转换

顺便说一下,DOUBLE 本身就是灾难性的,因为存在细微的舍入误差,例如3.0 /3.0 *3.0 可能会返回不等于 1.00.9999999999...;幸运的是 Hive 现在支持固定精度数字,例如 DECIMAL(22,7)

【讨论】:

感谢您的回答!我的情况是:A 加入 B 加入 C 加入 D。A、B、D 具有相同的加入条件,所以它们结合在一起,没关系。但是 hive 在分区 A、B 时会将字符串字段转换为双精度字段,该字段在所有三个表中都定义为 STRING。 A 加入 B 加入 C 没有这个问题,旧的 HIVE 版本 0.11 也没有,发生在 hive 0.13.1 没有实际的表定义和实际查询,很难诊断您的问题...

以上是关于HIVE 何时将字符串隐式转换为双精度值?的主要内容,如果未能解决你的问题,请参考以下文章

何时会发生隐式类型转换

如何在特定关键字之后将字符串转换为双精度?

如何使用 stringstream 在 C++ 中将字符串转换为双精度值 [关闭]

尝试将字符串转换为双精度时出错

译将字符转换为双精度浮点型

可能导致精度或幅度损失的 Java 隐式强制转换? [复制]