Spark-Csv写quotemode无法正常工作

时间:2016-09-03 10:48:50

标签: apache-spark apache-spark-sql spark-dataframe

我正在尝试使用Spark-CSV(https://github.com/databricks/spark-csv)将DataFrame写为CSV文件

我正在使用以下命令

res1.write.option("quoteMode", "NONE").format("com.databricks.spark.csv").save("File")

但我的CSV文件始终写为

“伦敦”
“哥本哈根协议”
“莫斯科”

而不是

伦敦
哥本哈根
莫斯科

7 个答案:

答案 0 :(得分:9)

是。使用反斜杠字符(\)关闭双引号字符(")的默认转义的方法,必须在.write()方法调用后使用正确的参数添加.option()方法调用。 option()方法调用的目标是改变csv()方法"找到"的方法。 "引用"的实例字符。为此,您必须更改"引用"的默认值。实际意味着;即将所寻求的字符从双引号字符(")更改为Unicode" \ u0000"字符(基本上提供了在一个格式良好的JSON文档中不会发生的Unicode NUL character)。

val dataFrame =
  spark.sql("SELECT * FROM some_table_with_a_json_column")
val unitEmitCsv =
  dataframe
    .write
    .option("header", true)
    .option("delimiter", "\t")
    .option("quote", "\u0000") //magic is happening here
    .csv("/FileStore/temp.tsv")

这只是我学习尝试使用Apache Spark并发出.csv文件的几个课程之一。有关此问题的更多信息和背景信息,请参阅我写的标题为" Example Apache Spark ETL Pipeline Integrating a SaaS"的博客文章。

答案 1 :(得分:3)

通过将quoteAll选项设置为false

,可以删除文本的双引号
dataframe.write
 .option("quoteAll", "false")
 .format("csv")

此示例与Spark 2.1.0一致,不使用数据库lib。

答案 2 :(得分:0)

如果您的DataFrame有一个字符串,您可以直接写出文本文件。

df.coalesce(1).map({ k:Row => k(0).toString}).toJavaRDD.saveAsTextFile("File")

如果您有多个列,则可以在写入输出文件之前将它们组合为单个字符串。

给出的其他答案可能会导致输出文件中出现不需要的空字符或空格字符。

答案 3 :(得分:0)

这个问题困扰了我很长时间,直到我读到以下内容:Adding custom Delimiter adds double quotes in the final spark data frame CSV outpu

这是标准的CSV功能。如果实际数据中出现定界符(称为定界符冲突),则将该字段括在引号中。 你可以试试 df.write.option(“ delimiter”,somechar) 这里的somechar应该是数据中不会出现的字符。

您可以将多列合并为一列,并使用不在数据中的定界符

答案 4 :(得分:0)

使用选项

.option("emptyValue", "")

那是火花2.4 +

答案 5 :(得分:0)

有一些类似的情况我也遇到过,最后我找到了一个sep参数可以改变结果,你可以试试这个:

df.write.mode("overwrite").option("sep","\t").csv(path)

答案 6 :(得分:-3)

我可以通过将quote选项设置为单个空格

来关闭它
df.coalesce(1).write.format("com.databricks.spark.csv").option("header", "true").option("quote"," ").option("codec", "org.apache.hadoop.io.compress.GzipCodec").save("File path")

但这只会取代将空格放在引号(“)

的选项

还有一个选项,即,当分隔符和分隔符相同时,引用通常作为限定符来分隔某些列

因此您可以更改分隔符并自动删除引用

df.coalesce(1).write.format("com.databricks.spark.csv").option("header", "true").option("delimiter", "|").option("codec", "org.apache.hadoop.io.compress.GzipCodec").save("File path")

希望这适用于您的情况