首页 > 解决方案 > Spark DataFrameWriter 在保存时省略尾随制表符分隔符 (Spark 1.6)

问题描述

我将我的问题留在下面,因为它最初是为了遇到这个问题的未来开发人员而发布的。一旦我迁移到 Spark2.0,这个问题就得到了解决——即输出与我预期的一样,没有对我的原始代码进行任何更改。看起来在我最初使用的 1.6 版本中存在一些实现差异。

我有 Spark 1.6 Scala 代码,它读取 TSV(带制表符分隔符的 CSV)并将其写入 TSV 输出(不更改输入 - 只是过滤输入)。输入数据有时在行的最后一列中具有空值。

当我使用分隔符“,”时,输出结尾有逗号。例如

val1, val2, val3,val4,val5

val1, val2, val3,,

但如果我使用制表符 (\t) 作为分隔符,则输出不包括尾随制表符。例如(我在这里写 TAB 出现 \t 的地方):

val1 TAB val2 TAB val3 TAB val4 TAB val5

val1 TAB val2 TAB val3  <= **here I expected two more tabs (as with the comma delimiter)**

我还尝试了其他定界符,发现当定界符是空白字符(例如 ' ' 字符)时,尾随定界符不在输出中。如果我使用其他可见分隔符(例如字母“z”),它与逗号分隔符一样工作正常,并且我有尾随分隔符。

我认为这可能与选项 ignoreLeadingWhiteSpace 和 ignoreTrailingWhiteSpace 有关,但在编写时将它们都设置为 false 也无济于事。

我的代码如下所示:

val df = sqlContext.read.format("com.databricks.spark.csv").option("delimiter", "\t").load(params.inputPathS3)
df_filtered = df.filter(...)
df_filtered.write.format("com.databricks.spark.csv").option("delimiter", "\t").save(outputPath)

我也试过(正如我上面写的):

df_filtered.write.format("com.databricks.spark.csv").option("delimiter", "\t").option("ignoreLeadingWhiteSpace", "false").option("ignoreTrailingWhiteSpace", "false").save(outputPath)

标签: scalacsvapache-sparkdelimiter

解决方案


下面是一个工作示例(使用 spark 1.6): 输入文件(最后有一些尾随空格):

1,2,3,,
scala> val df = sqlContext.read.option("ignoreLeadingWhiteSpace", "false").option("ignoreTrailingWhiteSpace", "false").format("com.databricks.spark.csv").option("delimiter", ",").load("path")
df: org.apache.spark.sql.DataFrame = [C0: string, C1: string, C2: string, C3: string, C4: string]

scala> df.show
+---+---+---+---+---+
| C0| C1| C2| C3| C4|
+---+---+---+---+---+
|  1|  2|  3|   |   |
+---+---+---+---+---+


scala> df.write.option("nullValue", "null").option("quoteMode", "ALL").mode("overwrite").format("com.databricks.spark.csv").option("delimiter", "\t").save("path")

scala> sqlContext.read.format("com.databricks.spark.csv").option("delimiter", "\t").load("path").show
+---+---+---+---+---+
| C0| C1| C2| C3| C4|
+---+---+---+---+---+
|  1|  2|  3|   |   |
+---+---+---+---+---+

请参考:使用 databricks csv 库读取、写入时的所有选项


推荐阅读