我把我的问题留在下面,因为它是最初发布的,以方便未来的开发者遇到这个问题。当我转移到Spark2.0后,这个问题就解决了--也就是说,在没有对我的原始代码进行任何修改的情况下,输出就和我预期的一样。看来是我一开始用的1.6版本在实现上有些差异。
我有一个Spark 1.6的Scala代码,它读取一个TSV(带tab分隔符的CSV)并将其写入TSV输出(不改变输入--只是过滤输入)。
当我使用定界符","时,输出有尾部的逗号。例如,当我使用分隔符", "时,输出有尾部的逗号。
val1, val2, val3,val4,val5
val1, val2, val3,,
但如果我使用tab (\t)作为定界符,输出就不包括尾部的tab。例如(我在这里写的是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)**
我还尝试了其他定界符,发现当定界符是一个空白字符时(例如''字符),尾部的定界符就不会出现在输出中。
我想这可能与选项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)
下面是一个工作实例(用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 cv库进行读取、写入时,所有选项。