2017-08-24 3 views
3

私は、テーブルに格納された値からCSVファイルを作成しようとしています:スパークdf.write引用すべてのフィールドではなくNULL値

df.repartition(1) 
    .write.option("header",true) 
    .option("delimiter", ",") 
    .option("quoteAll", true) 
    .option("nullValue", "") 
    .csv(S3Destination) 

| col1 | col2 | col3 | 
| "one" | null | "one" | 
| "two" | "two" | "two" | 

hive > select * from table where col2 is null; 
one null one 

私は以下のコードを使用してCSVファイルを取得しています

CSVは私が取得:CSV期待

"col1","col2","col3" 
"one","","one" 
"two","two","two" 

:NULL VALUE

FOR NO二重引用符で
"col1","col2","col3" 
"one",,"one" 
"two","two","two" 

データフレーム作成者がこれを行うオプションを持っているかどうかを知ることは助けになります。

答えて

2

あなたはUDFアプローチに行くと二重引用符は空の文字列のpossiblityがそこには

sqlContext.udf().register("convertToEmptyWithOutQuotes",(String abc) -> (abc.trim().length() > 0 ? abc : abc.replace("\"", " ")),DataTypes.StringType); 

Stringreplaceを持っているサンプルコードの下に表示さである(上記の再パーティションdatafrmaeにwithColumnを使用して)、カラムに適用することができますメソッドを呼び出します。

val a = Array("'x'","","z") 
println(a.mkString(",").replace("\"", " ")) 

+0

'x',,zはあなたの助けをありがとう生成します。それは有り難いです。 私はcsvを操作したくないので、データフレームライターが二重引用符をヌル値に追加しないオプションを持つ方法を探しています。 – dreddy

+1

申し訳ありませんAFAIK私はそのようなオプションが組み込まれていることに気づいていません。あなたが大丈夫であれば上記のアプローチは –

+1

で動作するはずです。それは他のユーザーへのポインタでもあります。ありがとう! –