案例: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  
相关推荐
我是发哥哈2 小时前
跨AI模型生成视频的五大维度对比:选型避坑指南
大数据·人工智能·学习·机器学习·chatgpt·音视频
逸Y 仙X2 小时前
Elasticsearch时间类型实战
java·大数据·elasticsearch·搜索引擎·全文检索
Dxy12393102164 小时前
Python如何处理树状分类数据
大数据·python·分类
凡人AI录5 小时前
小红书商业变现 100 个关键词:从流量逻辑到长期复利
大数据
zhongerzixunshi5 小时前
筑牢国家安全防线,赋能企业合规发展
大数据·人工智能·安全
小飞象—木兮5 小时前
2026数据资产入表解决方案(52页 PPT)
大数据·人工智能
Dotrust东信创智5 小时前
革新测试管理3.0:Storm UTP统一测试管理平台全链路追溯与AI赋能升级
大数据·人工智能·storm
烟台业荣数据科技有限公司6 小时前
智能建造知识拓展 | AR技术:虚实融合,赋能施工现场
大数据·人工智能·机器人
treesforest6 小时前
IP地理位置精准查询:从城市级到街道级的定位技术深度解析
大数据·网络·网络协议·tcp/ip·安全·网络安全·ip
小小王app小程序开发6 小时前
场馆预约小程序开发分析:线下实体转型利器,冠品科技助力商家高效增收
大数据·科技