Spark读取CSV至DataFrame时,如何在读取阶段对DoubleType列保留两位小数?
解决方案:读取CSV后处理四舍五入
好问题!直接在Spark的DataFrameReader读取阶段完成DoubleType列的四舍五入保留两位小数是做不到的——因为Reader的核心职责是解析原始数据并映射到你定义的Schema,这类数值格式化的计算操作属于读取之后的数据转换环节。不过实现这个需求其实很简单,分两步走就行:
步骤1:使用自定义Schema读取CSV文件
先按照你已经定义好的Schema读取CSV,这一步和你原本的计划一致:
import org.apache.spark.sql.types.{StructType, StructField, IntegerType, DoubleType} val customSchema = StructType(Array( StructField("id_1", IntegerType, true), StructField("id_2", IntegerType, true), StructField("id_3", DoubleType, true) )) // 读取CSV文件 val df = spark.read .schema(customSchema) .csv("your_file_path.csv")
步骤2:对目标列做四舍五入处理
读取完成后,使用Spark内置的round函数对id_3列进行格式化,保留两位小数。你可以选择覆盖原列,或者生成一个新的列:
方式1:覆盖原id_3列
import org.apache.spark.sql.functions.round val dfWithRounded = df.withColumn("id_3", round($"id_3", 2))
方式2:生成新的列(保留原列)
val dfWithRounded = df.withColumn("id_3_rounded", round($"id_3", 2))
补充说明
如果你的需求是在写入输出时保留两位小数,也可以在写入阶段通过format_number函数处理,或者配置输出格式的参数(比如写入CSV时设置decimalFormat),不过这和你提问的读取阶段处理是不同的场景。
内容的提问来源于stack exchange,提问作者shanlodh
相关产品推荐
相关产品推荐

