我正在阅读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 |