![](/img/trans.png)
[英]How can I convert a spark dataframe column, containing serialized json, into a dataframe itself?
[英]How can I print nulls when converting a dataframe to json in Spark
我有一個從 csv 讀取的數據框。
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。 我得到的是以下jsons。
{"name":"Alice","age":"23","pets":"dog"}
{"name":"Bob","age":"30","pets":"dog"}
{"name":"Charlie","age":"35"}
我希望第三行的 json 包含空值。 例如。
{"name":"Charlie","age":"35", "pets":null}
然而,這似乎是不可能的。 我通過代碼調試,看到Spark的org.apache.spark.sql.catalyst.json.JacksonGenerator
類有如下實現
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 中打印空值?
我正在使用Spark 2.1.0
要使用 Spark 的toJSON
方法打印 JSON 中的空值,您可以使用以下代碼:
myData.na.fill("null").toJSON
它會給你預期的結果:
+-------------------------------------------+
|value |
+-------------------------------------------+
|{"name":"Alice","age":"23","pets":"dog"} |
|{"name":"Bob","age":"30","pets":"dog"} |
|{"name":"Charlie","age":"35","pets":"null"}|
+-------------------------------------------+
我希望它有幫助!
我修改了 JacksonGenerator.writeFields 函數並包含在我的項目中。 下面是步驟——
1)在“src/main/scala/”中創建包“org.apache.spark.sql.catalyst.json”
2) 復制 JacksonGenerator 類
3) 在 '' 包中創建 JacksonGenerator.scala 類並粘貼復制的代碼
4)修改writeFields函數
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)
}
else{
gen.writeNullField(field.name)
}
i += 1
}}
import org.apache.spark.sql.types._
import scala.util.parsing.json.JSONObject
def convertRowToJSON(row: Row): String = {
val m = row.getValuesMap(row.schema.fieldNames).filter(_._2 != null)
JSONObject(m).toString()
}
用 Spark 3.0.0 測試:
創建spark.sql.jsonGenerator.ignoreNullFields
會話時,將spark.sql.jsonGenerator.ignoreNullFields
設置為 false。
toJSON
函數在內部使用org.apache.spark.sql.catalyst.json.JacksonGenerator
,后者又使用org.apache.spark.sql.catalyst.json.JSONOptions
進行配置。 后者包括一個選項ignoreNullFields
。 但是, toJSON
使用默認值,在此特定選項的情況下,默認值取自上面給出的 sql 配置。
配置設置為 false 的示例:
val schema = StructType(Seq(StructField("a", StringType), StructField("b", StringType)))
val rows = Seq(Row("a", null), Row(null, "b"))
val frame = spark.createDataFrame(spark.sparkContext.parallelize(rows), schema)
println(frame.toJSON.collect().mkString("\n"))
產生
{"a":"a","b":null}
{"a":null,"b":"b"}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.