我想使用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);
最佳答案
选项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);
关于java - 如何在Spark Java中将双引号添加到所有非空值以及标题上,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60797927/