🗒️Spark|类型转换踩坑记录
2023-7-19
| 2023-7-24
字数 663阅读时长 2 分钟
type
status
date
slug
summary
tags
category
icon
password

起因

客户反映了一个问题,在从 Spark2.1 升级到 Spark2.4 之后,原来能够运行的一段 SQL 现在跑不出预期的结果,数据总是缺少了一条,但是通过 Spark2.1 和 Hive 去查询是可以找到的。
SQL 大致内容如下(测试任务,不包含实际生产信息):
一开始我以为是文件存储在 hdfs 上的格式出了什么问题,但是使用了 orc、parquet、text 去验证还是会出现,真是令人头疼,最后花了两天的时间找到了问题。

排查流程

注意到这里有两个中文字段,会不会跟中文编码有关呢?然而经过一个个字段提取验证,中文的存在并不会影响查询结果。
然后我仔细查看了 Spark2.4 下 explain 得到的物理计划,发现了一个疑点:
在 Filter 里有 cast(pay_amount_cny#229353 as int) > 0 这么一个条件,这里所有的字段都是 string 类型,发生了隐式类型转换,会不会有问题呢?
pay_amount_cny 可以转换成整型类型吗?我查出了这个数据里的 pay_amount_cny 的值,值为 "2697000000.00",看起来是可以变成整数的。
但是这个值好像有点大,已经超出了 int 的范围 -2147483648 至 2147483647,会不会是这个原因呢?我在 Spark2.4 下进行了这个查询:
得到的结果竟然是 null!问题应该就出在这。
在 Spark2.1 下进行了这个查询,得到的结果是 true。

总结

简化一下 SQL,得到了这个结果。
对 Spark2.4:
对 Spark2.1:
原来是跟 0 这样的整数进行比较时:
在 Spark2.4,会转换成 INT 进行比较;
在 Spark2.1,会都转换成 DOUBLE 进行比较。
对于 Spark3.x 等更高版本下的表现,也和 Spark2.4 一致。
 
  • Spark
  • 问题排查
  • 浏览器插件开发Spark|执行计划缓存带来的一致性问题
    Loading...