案例:Spark/Hive中‘String=数值类型’丢失精度问题

问题描述 Spark/Hive执行sql,发现key不相等居然也关联上了:

sql 复制代码
select 
  a left join b   
      on   a.id = e.clue_id   --a.id类型:bigint,e.clue_id类型string
 where a.id=1734933297158217731

a.id e.clue_id dt timestamp


1734933297158217731 1734933297158217731 2023-12-14 2023-12-14 16:51:32

1734933297158217731 1734933297158217729 2023-12-14 2023-12-14 16:53:06

1734933297158217731 1734933297158217730 2023-12-14 2023-12-14 16:51:32

问题原因

使用HIve/Spark引擎执行sql时,当出现关联条件:String类型=数值类型(可能是double、int、bigint等),引擎会默认将两边的值cast成doble类型丢失精度,执行计划如下:

复制代码
Filter (id#27L = 1734933297158217731)
   +- Join LeftOuter, (if ((isnull(followup_kfid#12) || (followup_kfid#12 = ))) kf_id#33 else followup_kfid#12 = kf_id#136)
      :- Join LeftOuter, (cast(id#27L as double) = cast(clue_id#63 as double))
      :  :- SubqueryAlias `a`

验证一下:

解决办法 调整sql:

复制代码
 修改前: a left join b   on   a.id = a.id = e.clue_id                         where a.id=1734933297158217731
 修改后: a left join b   on   a.id = a.id = cast(e.clue_id as bigint)    where a.id=1734933297158217731  
相关推荐
hg01182 小时前
中企承建的突尼斯光伏项目实现商业运营
大数据
豌豆学姐2 小时前
Sora2 能做什么?25 秒视频生成 API 的一次接入实践
大数据·人工智能·小程序·aigc·php·开源软件
默 语2 小时前
Spring Boot 3.x升级踩坑记:到底值不值得升级?
hive·spring boot·后端
躺柒2 小时前
读共生:4.0时代的人机关系02人机合作后
大数据·人工智能·机器人·人机交互·人机协作·人机对话
ST小智3 小时前
2025年创作历程回顾与个人生活平衡
大数据·linux·人工智能
5G全域通3 小时前
面向5G复杂性的下一代运维技术体系:架构、工具与实践
大数据·运维·人工智能·5g·架构
GIS阵地3 小时前
git拉取时报错
大数据·git·elasticsearch
ha_lydms3 小时前
3、Spark 函数_d/e/f/j/h/i/j/k/l
大数据·分布式·spark·函数·数据处理·dataworks·maxcompute
ha_lydms5 小时前
AnalyticDB导入MaxCompute数据的几种方式
大数据·数据仓库·阿里云·dataworks·maxcompute·odps·analyticdb
拓端研究室5 小时前
专题:2025电商行业洞察报告:数字化、订阅电商、内容营销、B2B|附200+份报告PDF、数据、可视化模板汇总下载
大数据·人工智能