Как добавить двойные кавычки для всех ненулевых значений, а также не для заголовков в spark Java - PullRequest
0 голосов
/ 22 марта 2020

Я хочу записать набор данных в файл .csv, используя spark java, и данные набора данных должны быть в двойных кавычках, которые не равны нулю, а также заголовки в файле, которые на самом деле являются именами полей класса модели, не должны содержать двойной кавычки и значения в файле разделяются разделителем канала (|)

пример -> данные должны отображаться в файл в указанном ниже формате

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

1-я строка - это заголовок, представляющий собой имена полей класса, а 2-я строка - это данные

Здесь данные полей DEGREE и MAIL NULL, поэтому они не должны быть в двойных кавычках также заголовки не должны быть в двойных кавычках

Я пробовал это, но не работает в случае нулевых значений и заголовки для двойных кавычек

   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 Ответ

1 голос
/ 23 марта 2020

Опция 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);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...