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.0
的 0.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 何时将字符串隐式转换为双精度值?的主要内容,如果未能解决你的问题,请参考以下文章