Round Spark DataFrame就地

时间:2018-05-01 05:16:49

标签: apache-spark spark-dataframe

我将.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。

由于

1 个答案:

答案 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|
// +----+----+----+