scala - 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)
解决方案
下面是一个工作示例(使用 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 库读取、写入时的所有选项。
推荐阅读
- c++ - 为什么只有这些 C++ 标准库容器保证允许不完整的类型?
- android - 下载外部 .db 文件以在 Kotlin Android 应用程序中只读使用?
- javascript - Firefox Quantum 67.0 无法再点击我的 SVG 元素
- javafx - JavaFX ToggleGroup 不能与加速器一起正常工作 (RadioMenuItem)
- flutter - 通过 flutter_email_sender 发送带有附件的电子邮件在 Android 上不起作用
- java - 如何获取用户在 EditText 中输入的时间并从中扣除 5 小时 30 分钟?
- c# - 谁能告诉我我在尝试通过调用工作单元来测试控制器时做错了什么?
- php - PHP 和 ElasticSearch 6.7 - 双打被解析为字符串
- html - 在 HTML 表单中使用单个
- excel - 合并查询/扩展时如何避免 Power Query 重新排序我的数据