【spark】join异常分析(逻辑问题)

博客讲述了在使用SparkSQL进行数据表JOIN操作时,由于字段类型转换导致的数据量异常增长问题。当decimal(20,0)和String类型的字段在转换为double时,因精度丢失产生多对多匹配,从而生成了远超预期的2亿条数据。解决方案是通过cast函数统一转换字段类型为String,避免精度问题。建议在日常分析中使用explain关键字检查SQL执行计划以获取有用信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

最近我的小伙伴们,在使用spark sql进行两张数据表关联操作的时候,出现了如下的现象:
A 含有约89万的数据。
B含有约112万的数据。
A和表B之间的关联字段表A的字段c,和表B的字段d进行inner join
两表进行join的时候产生了约2亿条数据!!!
但是,其中表A中的字段c含有重复值。但是表B中的字段d是唯一的。
理论上来说,两个表之间在做inner join的时候,最大也就只有约200万的数据量。

问题原因

我们使用spark对数据进行分析。发现表A的字段c如上所述是含有重复值的。表B的字段d如上所述是唯一的。但是字段cdecimal(20,0) 字段dString类型的。在两表进行join的时候,针对decimal(20,0)的字段c会转换成double类型,针对String的字段d会转换成double类型。
好巧不巧的是:两个字段值是形如:1507991832587096065的19位数字。这19位数字用decimal(20,0)或者是String都可以正常表示的。但是使用double的时候,它会使用科学计数法表示1.50799183258709606E18 这样的话,double的精度只能到小数点之后的17位。等于就是舍去了最后一位数字
以上,会导致两个表之间就从多对一的关系,变成了多对多的关系。于是乎,在两表进行join的时候产生了约2亿条数据

处理办法

针对这两个字段在进行join的时候,使用cast函数转换数据类型。将decimal(20,0) 数据类型统一转换成String。问题解决

总结

如果在日常的分析sql的时候,不妨使用一下explain关键字。利用该关键字,可以分析一下sql的执行计划,可以从里面获取相关有价值的信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值