【问题标题】:Spark CSV read/write for empty field空字段的 Spark CSV 读/写
【发布时间】:2018-03-07 20:39:34
【问题描述】:

我想将 Dataframe 的空字段写为空,但它始终写为 NULL。我想将 NULLS 写为 ? 并将空写为空/空白。从 csv 读取时相同。

val df = sqlContext.createDataFrame(Seq(
    (0, "a"),
    (1, "b"),
    (2, "c"),
    (3, ""),
    (4, null)
))    

scala> df.show

|  0|   a|
|  1|   b|
|  2|   c|
|  3|    |
|  4|null|   
+---+----+

df.write.mode(SaveMode.Overwrite).format("com.databricks.spark.csv").option("nullValue","?").save("/xxxxx/test_out")

written output :

0,a
1,b
2,c
3,?
4,?
.option("treatEmptyValuesAsNulls" , "false")

此选项不起作用。

我需要空写成空

0,a
1,b
2,c
3,
4,?

【问题讨论】:

    标签: csv apache-spark dataframe


    【解决方案1】:

    尝试使用sql-

    我正在使用火花 2.2。

    val ds= sqlContext.sql("select `_1`, case when `_2` is not null then `_2` else case when `_2` is null then '?' else case when `_2` = '' then '' end end end as val "+
          "from global_temp.test");
    
        ds.write.csv("<output path>");
    

    【讨论】:

    • 这里所有列都需要这种情况条件(我有 130 列),并且在写入空字段时,CSV 写入将再次将其视为 NULL,我们需要使用 .option("nullValue"," ") 将其写为空。这可能是一种解决方法,谢谢。
    • 如果您有更多字段,则使用 map 转换并在循环中迭代每个字段,然后使用 UDF 应用 case statement。我对此进行了测试,空字段写为空白而不是空。
    猜你喜欢
    • 2021-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-21
    • 2019-10-19
    • 1970-01-01
    • 1970-01-01
    • 2018-11-29
    相关资源
    最近更新 更多