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")
Run Code Online (Sandbox Code Playgroud)
这输出:
0,a
1,b
2,c
3,unknown
4,unknown
Run Code Online (Sandbox Code Playgroud)
因此,它似乎将空字符串和null值都视为null.读取带有空引号字符串和空值的CSV文件时会发生同样的情况.目前有没有办法以不同方式对待这些?
仅仅两年半之后,null由于Spark 2.4.0,空字符串不再被视为等于值!有关功能的一些详细信息,请参阅此提交。您的代码将在 2.4.0+ 下按预期运行:
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")
Run Code Online (Sandbox Code Playgroud)
结果是:
0,a
1,b
2,c
3,
4,unknown
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6898 次 |
| 最近记录: |