Программа записи Spark CSV выводит двойные кавычки для пустой строки - PullRequest
0 голосов
/ 09 июля 2020

Я написал UDF для Scala Spark

import org.apache.spark.sql.functions.{col, udf}
def mapToString: Map[String, Double] => String = /** // returns k1:v1,k2:v2 or empty string if map is empty */

val mapToStringUDF = udf(mapToString)

// Then I try to save my Dataset as csv
      myDataset
      .withColumn("map_str", mapToStringUDF(col("map")))
      .drop("map")
      .write
      .option("header", false)
      .option("delimiter", "\t")
      .csv("output.csv")

он выводит "", если mapToStringUDF возвращает пустую строку. Я не хочу ничего выводить, если mapToStringUDF вернула пустую строку.

Как правильно это сделать?

1 Ответ

3 голосов
/ 10 июля 2020

Spark DataFrameWriter имеет два параметра для опции формата .csv, которые вы можете установить: nullValue и emptyValue, которые вы можете установить как null вместо пустых строк. См. Документацию DataFrameWriter здесь .

В вашем конкретном примере c вы можете просто добавить параметры в свой write оператор:

myDataset
  .withColumn("map_str", mapToStringUDF(col("map")))
  .drop("map")
  .write
  .option("emptyValue", null)
  .option("nullValue", null)
  .option("header", "false")
  .option("delimiter", "\t")
  .csv("output.csv")

Или вот полный пример, включая тестовые данные:

import org.apache.spark.sql.Row
import org.apache.spark.sql.types._

val data = Seq(
  Row(null, "20200506", "Hello"),
  Row(2, "20200607", null),
  Row(3, null, "World")
  )

val schema = List(
  StructField("Item", IntegerType, true),
  StructField("Date", StringType, true),
  StructField("Message", StringType, true)
  )

val testDF = spark.createDataFrame(
  spark.sparkContext.parallelize(data),
  StructType(schema)
  )

testDF.write
  .option("emptyValue", null)
  .option("nullValue", null)
  .option("header", "true")
  .csv(PATH)

Результат необработанного .csv должен выглядеть следующим образом:

Item,Date,Message
,20151231,Hello
2,20160101,
3,,World
...