2017-09-26 112 views
1

我想將Dataframe的空字段寫爲空,但始終寫爲NULL。我想寫NULLS爲?,並且爲空/空白。同時閱讀csv。Spark 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,? 

回答

0

嘗試使用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>"); 
+0

這裏所有列要求這種情況下條件(i有130列),再而寫的空字段將被視爲通過CSV空寫,我們就需要用到。選項(「NullValue屬性」,「」)把它寫成空的。這可能是一種解決方法,謝謝。 – satish

+0

如果你有更多的字段,然後使用'map'轉換並迭代循環中的每個字段,然後使用UDF應用'case語句'。我測試了這個,空字段寫成空白不爲空。 –

+0

好的,謝謝。 – satish