我将.csv文件读取到Spark DataFrame。对于DoubleType列,是否有一种方法可以在文件读取时指定此列应舍入到2个小数位?我还为DataFrameReader API调用提供自定义架构。这是我的架构和API调用:
val customSchema = StructType(Array(StructField("id_1", IntegerType, true),
StructField("id_2", IntegerType, true),
StructField("id_3", DoubleType, true)))
#using Spark's CSV reader with custom schema
#spark == SparkSession()
val parsedSchema = spark.read.format("csv").schema(customSchema).option("header", "true").option("nullvalue", "?").load("C:\\Scala\\SparkAnalytics\\block_1.csv")
在将文件读入DataFrame后,我可以将小数字舍入为:
parsedSchema.withColumn("cmp_fname_c1", round($"cmp_fname_c1", 3))
但是这会创建一个新的DataFrame,所以我也想知道它是否可以就地完成,而不是创建一个新的DataFrame。
由于
答案 0 :(得分:1)
您可以在加载CSV文件时为customSchema
中的DoubleType列指定DecimalType(10, 2)。假设您有一个包含以下内容的CSV文件:
id_1,id_2,Id_3
1,10,5.555
2,20,6.0
3,30,7.444
以下示例代码:
import org.apache.spark.sql.types._
val customSchema = StructType(Array(
StructField("id_1", IntegerType, true),
StructField("id_2", IntegerType, true),
StructField("id_3", DecimalType(10, 2), true)
))
spark.read.format("csv").schema(customSchema).
option("header", "true").option("nullvalue", "?").
load("/path/to/csvfile").
show
// +----+----+----+
// |id_1|id_2|id_3|
// +----+----+----+
// | 1| 10|5.56|
// | 2| 20|6.00|
// | 3| 30|7.44|
// +----+----+----+