Spark - CSV -写入选项-报价

0md85ypi  于 2022-11-16  发布在  Apache
关注(0)|答案(1)|浏览(180)

希望大家都过得好。
在为这个问题浏览spark csv datasource options时,我对各种可用的报价相关选项之间的差异感到非常困惑。

1.他们之间有什么具体的区别吗?
1.是否有选项优先于其他选项,或者它们都一起工作?
使用了链接问题中提到的例子来理解差异,但仍然有点困惑。谢谢你的所有帮助。

n6lpvg4x

n6lpvg4x1#

让我们看几个例子。

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|
+---+---+

当你的值中有逗号时,如果逗号与字段分隔符(如2,b,c)无法区分,Spark可以用引号将这些值括起来。默认情况下是双引号(如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

我们在这里使用了美元符号,不仅引用了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

在这里,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$

请注意,quoteAll = true 使 escapeQuotes 变得无关紧要。
如果不喜欢默认的反斜杠,可以使用escape为引号内的引号字符自定义转义符。

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

1,aaa
2,$b,c$
3,$d%$e$
4,$f%g$

最后,请注意,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$

不,你不可能再深入一点,然后逃脱...

相关问题