案例: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  
相关推荐
AllData公司负责人6 分钟前
杭州奥零数据科技 “2025全年度数据中台产品总结报告”
大数据·科技·开源
CNRio6 分钟前
Day 57:Git的高级技巧:使用Git的rebase交互式修改历史
大数据·git·elasticsearch
Promise微笑7 分钟前
2026年Geo优化的底层逻辑:从语义占位到数字信任的范式重构
大数据·人工智能·搜索引擎·重构·ai搜索
会编程的李较瘦29 分钟前
【期末考试总结】spark课程知识点
大数据·单例模式·spark
Code Slacker30 分钟前
第八届传智杯AI云计算大数据开发挑战赛练习题库(三)
大数据·人工智能·云计算·竞赛
无代码专家30 分钟前
无代码驱动行业数字化转型:从痛点突破到效能重构
大数据·低代码·制造
拓端研究室1 小时前
2025医疗人工智能报告:AI应用、IVD市场、健康科技|附240+份报告PDF、数据、可视化模板汇总下载
大数据·人工智能·物联网
天远数科1 小时前
Node.js全栈开发:深度集成天远贷前风险报告接口打造风控中台
大数据·node.js
Data_agent1 小时前
微店商品列表API接口指南
大数据·数据库·python
Vic101011 小时前
PostgreSQL 中序列(bigserial 和手动序列)的使用与注意事项
java·大数据·数据库·postgresql