我正在閱讀Spark的dynamodb表,該表在一個字段中包含一個JSON字符串,在其他字段中包含字符串。我能夠讀取JSON字段,但不能讀取嵌套的JSON字段。這不是query Json Column using dataframes的複製。這個問題解釋瞭如何從JSON字符串中提取列,但不是嵌套JSON列。從Sparko的DynamoDB JSON字符串中提取嵌套的Json字段?
import com.github.traviscrawford.spark.dynamodb._
val users = sqlContext.read.dynamodb("Dynamodb_table")
users.show(1)
試樣數據集合
|col1 | ID | field2|field3|
-------------------------------------------------------------------------------------
|{"a":[{"b":"value1","x":23},{"b":value2,"x":52}],"c":"valC"}|A1 | X1 |Y1 |
我需要從COL1(JSON結構)和ID字段提取幾個字段。我能夠弄清楚如何解析JSON字段(col1)並從col1獲取字段'c',如here所解釋的,但無法提取嵌套字段。
我的代碼:
val users = sqlContext.read.dynamodb("Dynamodb_table")
val data = users.selectExpr("get_json_object(col1, '$.c')","get_json_object(col1, '$.a')","ID")
data.show(1,false)
|a |c |ID|
---------------------------------------------------------
|[{"b":"value1","x":23},{"b":value2","x":52}...]|valC|A1|
現在,當我嘗試運用上面的數據幀在同get_json_object,我得到的所有空值。
val nestedData = data.selectExpr("get_json_object(a, '$.b')","c","ID")
nestedData.show(false)
|get_json_object(a, '$.b')| c | ID|
------------------------------------
|null |valC|A1 |
我試過爆炸以及col'a'有數組和結構。但是,這並不奏效,因爲數據框'data'將col/field'a'作爲字符串而不是數組返回。任何想法如何解決這個問題?
更新:我也嘗試使用JSON4s和net.liftweb.json.parse解析。這也沒有幫助
case class aInfo(b: String)
case class col1(a: Option[aInfo]), c: String)
import net.liftweb.json.parse
val parseJson = udf((data: String) => {
implicit val formats = net.liftweb.json.DefaultFormats
parse(data).extract[Data]
})
val parsed = users.withColumn("parsedJSON", parseJson($"data"))
parsed.show(1)
當我使用這些解析器時,所有值都爲空。
我預期的結果:我想從數據集
|b |x |c | ID|
--------------------
|value1|23|valC|A1 |
|value2|52|valC|A1 |