Spark - CSV - 写入选项 - 报价

rai*_*ros 5 csv apache-spark spark-csv databricks

希望每个人都做得很好。

在查看问题的Spark csv 数据源选项时,我对可用的各种报价相关选项之间的差异感到非常困惑。

Spark-csv-报价选项

  1. 它们之间有什么详细的区别吗?
  2. 是否有一个选项会覆盖另一个选项,或者它们都一起工作?

使用链接问题中提到的示例来理解差异,但仍然有点困惑。感谢您的所有帮助。

Kom*_*owy 5

让我们看几个例子。

val df = Seq(
  (1, "aaa"),
  (2, "b,c"),
  (3, "d$e"),
  (4, "f%g")
).toDF("x", "y")
df.show

+---+---+
|  x|  y|
+---+---+
|  1|aaa|
|  2|b,c|
|  3|d$e|
|  4|f%g|
+---+---+
Run Code Online (Sandbox Code Playgroud)

每当值中的逗号与字段分隔符(例如 )无法区分时,2,b,cSpark 就可以引用此类值。默认情况下它是双引号(如2,"b,c"),但您可以使用quote选项自定义它。

df.coalesce(1).write.mode("overwrite")
  .option("quote", "$")
  .csv("x")

1,aaa
2,$b,c$
3,$d\$e$
4,f%g
Run Code Online (Sandbox Code Playgroud)

我们在这里使用美元符号。不仅b,c被引用,而且由于d$e包含美元,它也被引用,并且美元本身被转义。

我不知道您为什么要这样做,但您可以要求 Spark 不要使用 escapeQuotes选项转义包含引号字符的字段。

df.coalesce(1).write.mode("overwrite")
  .option("quote", "$")
  .option("escapeQuotes", false)
  .csv("x")

1,aaa
2,$b,c$
3,d$e
4,f%g
Run Code Online (Sandbox Code Playgroud)

在这里,d$e仍然没有被引用。

您还可以使用quoteAll强制它引用每个字段。

df.coalesce(1).write.mode("overwrite")
  .option("quote", "$")
  .option("quoteAll", true)
  .csv("x1")

$1$,$aaa$
$2$,$b,c$
$3$,$d\$e$
$4$,$f%g$
Run Code Online (Sandbox Code Playgroud)

请注意,quoteAll = true使得escapeQuotes无关紧要。

如果您不喜欢默认的反斜杠,可以使用escape自定义quote 内引号字符的转义字符。

df.coalesce(1).write.mode("overwrite")
  .option("quote", "$")
  .option("escape", "%")
  .csv("x1")

1,aaa
2,$b,c$
3,$d%$e$
4,$f%g$
Run Code Online (Sandbox Code Playgroud)

最后,请注意 中有一个独立的转义字符f%g,因此如果您想转义它,请使用charToEscapeQuoteEscaping

df.coalesce(1).write.mode("overwrite")
  .option("quote", "$")
  .option("escape", "%")
  .option("quoteAll", true)
  .option("charToEscapeQuoteEscaping", "^")
  .csv("x1")

$1$,$aaa$
$2$,$b,c$
$3$,$d%$e$
$4$,$f^%g$
Run Code Online (Sandbox Code Playgroud)

不,你不能再深入并逃脱^……