2017-08-11 5 views
2

私はcsvから読み込んだデータフレームを持っています。Sparkでデータフレームをjsonに変換するときにnullを出力するには

CSV: 
name,age,pets 
Alice,23,dog 
Bob,30,dog 
Charlie,35, 

Reading this into a DataFrame called myData: 
+-------+---+----+ 
| name|age|pets| 
+-------+---+----+ 
| Alice| 23| dog| 
| Bob| 30| dog| 
|Charlie| 35|null| 
+-------+---+----+ 

は今、私はmyData.toJSONを使用してJSONにこのデータフレームの各列を変換したいです。私が得ることは以下のようなものです。

{"name":"Alice","age":"23","pets":"dog"} 
{"name":"Bob","age":"30","pets":"dog"} 
{"name":"Charlie","age":"35"} 

3行目のjsonにnull値を含めることをお勧めします。 Ex。

{"name":"Charlie","age":"35", "pets":null} 

しかし、これは可能ではないようです。私は、コードをデバッグし、スパークのorg.apache.spark.sql.catalyst.json.JacksonGeneratorクラスは、これはそれがnullの場合、列を飛ばしているように見える次の実装

private def writeFields(
    row: InternalRow, schema: StructType, fieldWriters: 
    Seq[ValueWriter]): Unit = { 
    var i = 0 
    while (i < row.numFields) { 
     val field = schema(i) 
     if (!row.isNullAt(i)) { 
     gen.writeFieldName(field.name) 
     fieldWriters(i).apply(row, i) 
     } 
     i += 1 
    } 
    } 

を持っていることがわかりました。私はこれがデフォルトの動作である理由はよく分かりませんが、SparkのtoJSONを使用してjsonでnull値を出力する方法がありますか?私はスパークのtoJSONメソッドを使用してJSONでnull値を印刷するにはスパーク2.1.0

答えて

5

を使用しています

、次のコードを使用することができます。

myData.na.fill("null").toJSON 

をそれはあなたに期待される結果が得られます

+-------------------------------------------+ 
|value          | 
+-------------------------------------------+ 
|{"name":"Alice","age":"23","pets":"dog"} | 
|{"name":"Bob","age":"30","pets":"dog"}  | 
|{"name":"Charlie","age":"35","pets":"null"}| 
+-------------------------------------------+ 

私はそれが助けてくれることを願っています!

+0

nullの周りに二重引用符を入れるため、na.fillは使用しません。これは値をnullに設定するのと同じではありません。 – Rahul

+2

@Rahul 'df.na.fill(null.asInstanceOf [String])'を使うことができ、 ''ペット '': '" '' – philantrovert

+1

@himanshuIIITianが得られます。あなたのアプローチはStrings以外のデータ型に対しても機能しません。私はあなたの答えをupvotedしましたが、これは私が探しているものではありません。 – Rahul

関連する問題