如何在spark Java中为所有非空值和标题添加双引号

如何在spark Java中为所有非空值和标题添加双引号,java,apache-spark,Java,Apache Spark,我想使用spark java在.csv文件中写入数据集,数据集的数据应该用不为null的双引号括起来,并且文件中的标题(实际上是模型类的字段名)不应该包含双引号,文件中的值用管道分隔符(|)分隔 示例->数据应以以下给定格式显示到文件中 姓名|身份证|手机|号码|学位|称呼|姓氏|邮件|出生日期 “史密斯”|“56354”|“46535353”| | |“先生日志”|“日志”| |“2013-10-24T11:04:52+00:00” 第一行是标题,是类的字段名,第二行是数据 此处,程度和邮件字

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

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

姓名|身份证|手机|号码|学位|称呼|姓氏|邮件|出生日期 “史密斯”|“56354”|“46535353”| | |“先生日志”|“日志”| |“2013-10-24T11:04:52+00:00”

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

此处,程度邮件字段的数据为空,因此不应双引号标题也不应双引号

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

   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);

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

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

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);
   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);

Java:

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);
   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);

专用列quoteColumn(c列){
列引号=lit(“\”);
当(c.isNotNull(),concat(quote,c.cast(StringType),quote))时返回。否则(c.cast(StringType));
}
Dataset resDF=df.select(Arrays.stream(df.columns()).map(a->quoteColumn(col(a)).as(a)).toArray(Column[]::new));
resDF.write()
.格式(“csv”)
.option(“分隔符”、“|”)
.选项(“标题”,真)
//将quote设置为空
.选项(“报价单”、“报价单”)
//为空值设置null
.选项(“null值”,null)
.mode(SaveMode.Overwrite)
.保存(路径);

不知道scala,你能用java提供代码吗