案例: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  
相关推荐
TDengine (老段)6 分钟前
TDengine 应用案例 — IoT 设备监控
大数据·数据库·物联网·时序数据库·tdengine·涛思数据
微石科技13 分钟前
体征监测设备厂家怎么选?宁波市微石科技:专业级硬件,全品类可定制
大数据·人工智能·科技
智搜广告18 分钟前
AI回答优化公司智搜广告让品牌成为推荐首选
大数据·人工智能·python·elasticsearch·geo
头茬韭菜23 分钟前
功能点 9:Flink Connector
大数据·flink·fluss
JJJennie77727 分钟前
MAI Gateway技术揭秘:大模型网关有哪些功能?从原理到落地
大数据·人工智能·大模型·gateway·软件工程·ai网关
天天爱吃肉821829 分钟前
XCP协议 Part 1 概述 — 完整学习笔记(商用车主机厂工程师版)
大数据·笔记·python·学习·汽车
starzy199030 分钟前
SparkStreaming 之配置参数详解
大数据·spark
故七月34 分钟前
基于最新Geo数据的测评行业服务商分析——万域智瞰深度洞察
大数据·人工智能
weixin_4691636935 分钟前
从提示词到驾驭工程:金融 AI 需求工程的三段式演进路径
大数据·人工智能·金融
海兰43 分钟前
【应用】Ubuntu 24 搭建大数据 & AI 应用云原生容器化实践
大数据·人工智能·ubuntu