案例: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  
相关推荐
九硕智慧建筑一体化厂家28 分钟前
什么是楼宇自控?全面解析楼宇自控与楼宇自控系统的作用
大数据·运维·人工智能·网络协议·制造
灰化肥发挥1 小时前
韩国草药制剂数据查询:如何获取MFDS注册数据与韩国药典标准?
大数据·人工智能·医药数据库
小王毕业啦1 小时前
2010-2023年 地级市-破产法庭设立数据(+文献)
大数据·人工智能·数据挖掘·数据分析·社科数据·经管数据·破产法庭
雷焰财经1 小时前
从系统承建到生态赋能:宇信科技全球化战略的纵深与逻辑
大数据·人工智能·科技
智慧化智能化数字化方案2 小时前
数据资产管理——解读数据资产管理制度_高清版【附全文阅读】
大数据·数据资产管理制度
焦糖玛奇朵婷2 小时前
盲盒小程序一站式开发
java·大数据·服务器·前端·小程序
九河云2 小时前
零售企业云转型:全渠道融合背后的云基础设施支撑
大数据·微服务·重构·产品运营·零售·数字化转型
Elastic 中国社区官方博客2 小时前
Elasticsearch Serverless 的无状态架构
大数据·数据库·elasticsearch·搜索引擎·云原生·架构·serverless
十月南城2 小时前
实时数据平台的价值链——数据采集、加工、存储、查询与消费的协同效应与ROI评估
数据库·数据仓库·hive·hadoop·spark
scofield_gyb3 小时前
MySQL 批量插入详解:快速提升大数据导入效率的实战方法
大数据·数据库·mysql