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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:55:04