【发布时间】:2020-03-07 03:52:50
【问题描述】:
CSVFileFormat 似乎在字符串列中读取和写入空值作为 null。找了一圈也没找到明确的信息,所以整理了一个简单的测试。
val df = session.createDataFrame(Seq(
(0, "a"),
(1, "b"),
(2, "c"),
(3, ""),
(4, null)
))
df.coalesce(1).write.mode("overwrite").format("csv")
.option("delimiter", ",")
.option("nullValue", "unknown")
.option("treatEmptyValuesAsNulls", "false")
.save(s"$path/test")
这个输出:
0,a
1,b
2,c
3,unknown
4,unknown
因此,它似乎将空字符串和null 值都视为null。读取带有空引号字符串和空值的 CSV 文件时也会发生同样的事情。目前有什么方法可以区别对待吗?
【问题讨论】:
-
似乎他们在github.com/apache/spark/pull/14118 中明确将空字符串设置为null。并且有一个开放的 PR 可以提供空字符串与空值 - github.com/apache/spark/pull/12904。
-
你不能简单地替换
null并在写入之前和之后用不同的值清空吗?我认为您发布的其中一个链接中也提到了它。 -
@Chitral Verma 当然,这是可能的,但并不总是可行,具体取决于文件的源或目标。它还为我认为不必要的每次读取和写入添加了额外的转换步骤。
-
无论何时合并这些更改,转换开销仍然存在。不过这只是抽象的。源和目标并不重要,因为这个问题只与 CSVFileFormat 相关
标签: csv apache-spark