我将我的问题留在下面,因为它最初是为了遇到这个问题的未来开发人员而发布的。一旦我迁移到 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)