生成CSV文件时如何消除科学计数法?Delta表导出场景求助
解决Delta表导出CSV时Double类型数值显示科学计数法的问题
核心解决方案
方法1:禁用CSV写入的科学计数法(Spark 3.0+适用)
Spark的CSV写入器提供了disableScientificNotation参数,直接设置为true即可强制大数值以普通数字格式输出,无需修改列类型:
# Python 代码示例 df = spark.read.format("delta").load("/path/to/your/delta-table") df.write.format("csv") \ .option("header", "true") \ .option("disableScientificNotation", "true") \ .save("/path/to/csv-output")
// Scala 代码示例 val df = spark.read.format("delta").load("/path/to/your/delta-table") df.write.format("csv") .option("header", "true") .option("disableScientificNotation", "true") .save("/path/to/csv-output")
方法2:将Double列转换为字符串(兼容所有Spark版本)
如果你的Spark版本低于3.0,或者需要更精准的格式控制,可以将Double列先转换为足够精度的Decimal类型,再转成字符串,彻底避免科学计数法:
# Python 代码示例 from pyspark.sql.functions import col df = spark.read.format("delta").load("/path/to/your/delta-table") # 转换为decimal(18,0)适配整数,若有小数可调整为decimal(18,2)等格式 processed_df = df.withColumn("a", col("a").cast("decimal(18,0)").cast("string")) processed_df.write.format("csv").option("header", "true").save("/path/to/csv-output")
// Scala 代码示例 import org.apache.spark.sql.functions._ val df = spark.read.format("delta").load("/path/to/your/delta-table") val processedDf = df.withColumn("a", col("a").cast("decimal(18,0)").cast("string")) processedDf.write.format("csv").option("header", "true").save("/path/to/csv-output")
关于format_number无效的原因
你之前使用format_number仅单条记录生效、多条失效,大概率是因为:
format_number返回的是带千分位分隔符的字符串(如22,409,595),若后续写入时未确保列类型为字符串,可能被Spark重新解析为数值类型,再次触发科学计数法;- 未正确用处理后的字符串列覆盖原Double列,导致最终写入的还是原始的Double类型数据。
内容的提问来源于stack exchange,提问作者Siva
相关产品推荐
相关产品推荐

