2017-09-26 1 views
1

Ich möchte durch leeres Feld von Dataframe als leer schreiben, aber es schreibt immer als NULL. Ich möchte NULLS schreiben als ? und leer als leer/leer. Gleiches beim Lesen von einem CSV.Spark CSV lesen/schreiben für leeres Feld

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") 

Diese Option funktioniert nicht.

Ich brauche die leer wie leer

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

Antwort

0

Versuchen SQL-

Ich bin mit 2.2 Funken mit zu schreiben.

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

hier alle Spalten erfordert diesen Fall die Bedingung (i haben 130 Spalten), und wieder, während die leeren Felder Schreiben wird als NULL durch CSV genommen werden schreiben und wir müssen .option verwenden („Nullvalue“, „“) um es als leer zu schreiben. Es kann ein Workaround sein, Danke. – satish

+0

Wenn Sie mehr Felder haben, dann verwenden Sie 'map' Transformation und iterieren jedes Feld in der Schleife, dann wenden Sie' case statement' mit UDF an. Ich habe das getestet und leere Felder werden als leer und nicht null geschrieben. –

+0

ok, danke. – satish