如何在Spark Java中将双引号添加到所有非空值以及标题上

时间:2020-03-22 09:56:48

标签: java apache-spark

我想使用spark java将数据集写入.csv文件,并且数据集的数据应使用双引号(不为null),并且文件中的标题(实际上是模型类的字段名称)不应包含双引号,并且文件中的值由管道定界符(|)分隔

示例->数据应以以下给定格式显示在文件中

NAME | ID | MOBILE_NUMBER | DEGREE | SALUTATION | LASTNAME | MAIL | DATE_OF_BIRTH “ SMITH” |“ 56354” |“ 46535353” ||“ MR LOG” |“ LOG” ||“ 2013-10-24T11:04:52 + 00:00”

第一行是标题,是类的字段名称,第二行是数据

此处 DEGREE MAIL 字段的数据为空,因此不应用双引号,并且标题应不能双引号

我尝试过这种方法,但是在空值和双引号的标题不起作用的情况下

   dataset.toDF().selectExpr(NAME,ID,MOBILE,DEGREE,SALUTATION,LASTNAME,MAIL,DATE_OF_BIRTH)
        .write().format("csv")
        .option("delimiter", "|"),
        .option("quotesAll",true),
        .option("header", true)
        .option("nullValue", null)
        .mode(SaveMode.Overwrite)
        .save(path);

1 个答案:

答案 0 :(得分:1)

选项quoteAll将引用所有内容(包括标题)。类CSVOptions没有用于自定义格式的此类选项。

您可以编写一个自定义表达式来引用非空值,然后保存它。

scala:

val quote = lit("\"")

  //quote value if not null otherwise return.
  def quoteColumn(c: Column) = when(c.isNotNull, concat(quote, c.cast(StringType), quote )) otherwise c.cast(StringType)

  //call quoteColumn to add quote in all column values in the DataFrame
  val resDF = df.select(df.columns.map(a => quoteColumn(col(a)).as(a)):_*)


  resDF.write()
    .format("csv")
    .option("delimiter", "|")
    .option("header", true)
    //set quote to empty, no need to set null
    .option("quote", "")
    .mode(SaveMode.Overwrite)
    .save(path);

Java:

   private Column quoteColumn(Column c) {
        Column quote = lit("\"");
        return when(c.isNotNull(), concat(quote, c.cast(StringType), quote)).otherwise(c.cast(StringType));
    }
   Dataset<Row> resDF = df.select(Arrays.stream(df.columns()).map(a -> quoteColumn(col(a)).as(a)).toArray(Column[]::new));

   resDF.write()
      .format("csv")
      .option("delimiter", "|")
      .option("header", true)
      // set quote to empty
      .option("quote", "")
      // set null for null values
      .option("nullValue", null)
      .mode(SaveMode.Overwrite)
      .save(path);

相关问题