案例: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 分钟前
Spark-Streaming性能调优
大数据·分布式·spark
新加坡内哥谈技术1 小时前
NVIDIA发布紧凑型生成式AI超级计算机:性能提升,价格更低
大数据·人工智能·语言模型·自然语言处理
埃文科技1 小时前
数据资产入表 解锁智慧城市新潜力
大数据
凌抆莂3 小时前
浏览器引入elasticsearch-head插件
大数据·elasticsearch·jenkins
大G哥3 小时前
使用 Elasticsearch 查询和数据同步的实现方法
大数据·elasticsearch·搜索引擎·oracle·全文检索
YONG823_API3 小时前
1688跨境代购代采业务:利用API实现自动化信息化
大数据·数据库·人工智能·爬虫·缓存·数据挖掘
kaoyaoyao4 小时前
打通全网SEO优化:提高百度、B站、抖音等平台搜索排名
大数据·百度·seo·公众号排名优化·公众号排名
高hongyuan4 小时前
Linux环境下 搭建ELk项目 -单机版练习
大数据·运维·服务器·elk·elasticsearch·搜索引擎
Dyn's blog4 小时前
nodejs实现es调研报告
大数据·elasticsearch·搜索引擎
QQ同步助手4 小时前
Elasticsearch 实战应用:开启数据搜索与分析新征程
大数据·elasticsearch·搜索引擎