私は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
nullの周りに二重引用符を入れるため、na.fillは使用しません。これは値をnullに設定するのと同じではありません。 – Rahul
@Rahul 'df.na.fill(null.asInstanceOf [String])'を使うことができ、 ''ペット '': '" '' – philantrovert
@himanshuIIITianが得られます。あなたのアプローチはStrings以外のデータ型に対しても機能しません。私はあなたの答えをupvotedしましたが、これは私が探しているものではありません。 – Rahul