Круглый Spark DataFrame на месте - PullRequest
0 голосов
/ 01 мая 2018

Я читаю файл .csv в Spark DataFrame. Для столбца DoubleType есть ли способ указать во время чтения файла, что этот столбец должен быть округлен до 2 десятичных знаков? Я также поставляю пользовательскую схему для вызова API DataFrameReader. Вот моя схема и вызовы 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 голосов
/ 01 мая 2018

Вы можете указать, скажем, DecimalType (10, 2) для столбца DoubleType в customSchema при загрузке файла CSV. Допустим, у вас есть файл 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|
// +----+----+----+
...