案例: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  
相关推荐
无忧智库35 分钟前
数字化转型 | 全面揭秘企业经营的数字化解决方案 —— 从挑战到突破
大数据·人工智能
Circle Studio44 分钟前
AI算力发展的未来趋势
大数据·人工智能
rainy雨1 小时前
精益数据分析系统功能拆解:如何用精益数据分析解决指标虚高难题与初创期验证场景
大数据·数据库·人工智能·信息可视化·数据挖掘·数据分析·精益工程
GlobalInfo1 小时前
2026全球及中国源网荷储一体化方案市场风险评估及前景规划建议报告
大数据·人工智能
跨境卫士-小汪2 小时前
平台验证升级以后社媒团队如何避免账号批量异常
大数据·人工智能·产品运营·跨境电商·营销策略
璞华Purvar2 小时前
香精香料PLM优选:璞华易研以AI配方能力,赋能行业研发升级(2026年)
大数据·人工智能
做个文艺程序员2 小时前
Spring AI 1.1 三件套实战:Structured Output + Tool Calling + Memory 从踩坑到生产落地
java·大数据·人工智能
档案宝档案管理2 小时前
档案管理系统:数据可视化+多维度报表,档案管理决策更科学
大数据·信息可视化·数据分析
Elastic 中国社区官方博客3 小时前
组合 OpenTelemetry 参考架构
大数据·数据库·elasticsearch·搜索引擎·架构