求助:将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
相关产品推荐
相关产品推荐

