在Spark 2.0.1中读写空字符串""vs NULL

Kyr*_*yro 14 csv apache-spark

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文件时会发生同样的情况.目前有没有办法以不同方式对待这些?

bsp*_*ion 7

仅仅两年半之后,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)