DataFrameWriter.csv()在写入CSV文件时修剪数据集<row>中的所有字段

时间:2017-06-25 07:20:40

标签: apache-spark

在spark 2.1中使用Dataset<Row> csv方法将DataFrameWriter写入csv文件时,默认情况下会修剪所有String字段。 例如,对于列:

"    0"," Shop "," CA"

写作:

"0","Shop","CA"

在csv文件中。

我使用了以下选项:

dataFrame.write()
  .format("csv")
  .option("header", "false")
  .option("dateFormat", "yyyy-MM-dd")
  .option("sep", ",")
  .option("ignoreLeadingWhiteSpace", "false")
  .option("ignoreTrailingWhiteSpace","false")                 
  .option("escape", "\"")
  .option("quoteALL","true")
  .save(path);

但它仍在修剪田地。 我希望字段未修剪。 任何人都可以帮我吗?

2 个答案:

答案 0 :(得分:2)

不幸的是,你必须RTFSC =“阅读f ... 源代码”。

我在分支2.1中找到了DataFrameWriter的来源:
https://github.com/apache/spark/blob/branch-2.1/sql/core/src/main/scala/org/apache/spark/sql/DataFrameWriter.scala

评论说明......

  

您可以为书写 CSV设置以下特定于CSV的选项   文件
sep ... quote ... escape ... escapeQuotes ...   quoteAll ... header ... nullValue ... compression ...   dateFormat ... timestampFormat

这就是为什么ignoreLeadingWhiteSpaceignoreTrailingWhiteSpace的设置被忽略的原因 - 只有当读取 CSV文件时,才会通过DataFrameReader应用这些设置。


此时,您必须尝试使用​​引号
[edit] 您的示例已在所有地方显示引号,但您不强制quoteAll默认情况下为false。真是令人费解。

我的建议:通过在值周围添加显式引号字符来转换要保持未修剪的列,然后将结果保存为CSV 而不自动引用

答案 1 :(得分:0)

最后是否应该调用另一种方法(如text(path)save(path)

其他选项是否有效?一个疯狂的猜测是与订购有关。