You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:将DataFrame列中科学计数法转换为十进制值

解决Spark中科学计数法字符串转Decimal的问题

问题分析

你的value列是字符串类型的科学计数法格式(如"1.873452634567E7"),直接使用cast("Decimal(14,4)")无效的核心原因是:Spark内置的cast无法直接解析字符串形式的科学计数法为Decimal类型,必须先完成字符串到数值类型的转换,再转Decimal。

解决方案

根据Spark版本,推荐两种可行方案:

方案1:使用to_number函数(Spark 3.0+ 推荐)

to_number函数可以直接解析字符串格式的科学计数法,转换为数值后再转Decimal,精度损失更小:

import org.apache.spark.sql.functions.{col, to_number}

// 直接转换为指定精度的Decimal
val resultDf = df.withColumn("s", to_number(col("value")).cast("Decimal(14,4)"))

也可以通过格式字符串指定解析规则:

val resultDf = df.withColumn("s", to_number(col("value"), "99999999999999.9999"))

方案2:先转Double再转Decimal(兼容低版本Spark)

如果你的Spark版本低于3.0,可以先将字符串转为Double类型,再转Decimal:

import org.apache.spark.sql.functions.col

val resultDf = df.withColumn("s", col("value").cast("Double").cast("Decimal(14,4)"))

注意:Double类型有精度限制,对于超长小数位的数值可能会有精度损失,优先推荐方案1。

验证结果

转换后null值会被保留,数值会转为十进制格式,例如1.873452634567E7会转为18734526.3457(保留4位小数)。

内容的提问来源于stack exchange,提问作者ravish kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 20:21:15