1

初始数据在 Dataset<Row> 中,我正在尝试将每个单元格值写入 csv 文件以放在引号中。

result.coalesce(1).write()
            .option("delimiter", "|")
            .option("header", "true")
            .option("nullValue", "")
            .option("quoteMode", "ALL_NON_NULL")
            .csv(Location);

预期输出:

null
"London"|"UK"
"Delhi"|"India"
"Moscow"|"Russia"

电流输出:

null
London|UK
Delhi|India
Moscow|Russia

星火版本是 2.3

4

2 回答 2

3

正如@Oli 回答的那样,您拥有的第一个选项是"quoteMode"CSV 编写器。

如果您需要更多控制,则可以在所有列上使用 concat 函数来为您的值添加前缀和后缀。下面的例子

import org.apache.spark.sql.functions.{concat, lit, col}

val df = Seq(
("1","a",null,"c"),
("3",null,"d","c"),
("4","a","b",null)
).toDF("id","A","B","C")

df.show()

+---+----+----+----+
| id|   A|   B|   C|
+---+----+----+----+
|  1|   a|null|   c|
|  3|null|   d|   c|
|  4|   a|   b|null|
+---+----+----+----+

val dfquotes = df.select(df.columns.map(c => concat(lit("\""), col(c), lit("\"")).alias(c)): _*)

dfquotes.show()

+---+----+----+----+
| id|   A|   B|   C|
+---+----+----+----+
|"1"| "a"|null| "c"|
|"3"|null| "d"| "c"|
|"4"| "a"| "b"|null|
+---+----+----+----+
于 2020-02-05T11:26:55.837 回答
2

"quoteMode"是 databrick 的 CSV 写入器的一个选项。在这里,您使用的是 spark 的内置 CSV 编写器,它不支持该选项。查看此页面以获取可用选项。

在您的情况下,您正在寻找的选项是.option("quoteAll", true).

于 2020-02-04T15:31:08.337 回答