gpt4 book ai didi

java - 如何向所有非空值添加双引号,并且不在 Spark Java 的标题上添加双引号

转载 作者:行者123 更新时间:2023-12-02 08:50:42 26 4
gpt4 key购买 nike

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

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

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

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

这里DEGREEMAIL字段的数据为空,因此它们不应该用双引号也应该标题不能双引号

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

   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 类没有此类自定义格式选项。

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

斯卡拉:

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com