Apache spark 使用Spark从DynamoDB Json字符串中提取嵌套的Json字段?

Apache spark 使用Spark从DynamoDB Json字符串中提取嵌套的Json字段?,apache-spark,pyspark,amazon-dynamodb,apache-spark-sql,Apache Spark,Pyspark,Amazon Dynamodb,Apache Spark Sql,我正在从Spark读取一个dynamodb表,这个表在一个字段中有一个JSON字符串,在其他字段中有一个字符串。我能够读取JSON字段,但不能读取嵌套的JSON字段。这不是一个复制品。这个问题解释了如何从JSON字符串中提取列,而不是从嵌套的JSON列中提取列 import com.github.traviscrawford.spark.dynamodb._ val users = sqlContext.read.dynamodb("Dynamodb_table") 用户。显示(1) 样本数据

我正在从Spark读取一个dynamodb表,这个表在一个字段中有一个JSON字符串,在其他字段中有一个字符串。我能够读取JSON字段,但不能读取嵌套的JSON字段。这不是一个复制品。这个问题解释了如何从JSON字符串中提取列,而不是从嵌套的JSON列中提取列

import com.github.traviscrawford.spark.dynamodb._
val users = sqlContext.read.dynamodb("Dynamodb_table")
用户。显示(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”,如前所述,但无法提取嵌套字段

我的代码:

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_对象时,我得到了所有空值

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)
当我使用这些解析器时,所有值都显示为null

我的预期结果是:我试图从数据集中得到一个扁平化的结构

|b     |x |c   | ID|
--------------------
|value1|23|valC|A1 |
|value2|52|valC|A1 |

我相信拼图中所有需要的部分都已经在这里了,所以让我们一步一步地遵循这个步骤。您的数据相当于:

val df=Seq((
“{a:[{b:“value1”},{b:“value2”}],“c:“valC”}”“,“A1”,“X1”,“Y1”
)).toDF(“col1”、“ID”、“field2”、“field3”)
Spark提供了json4s,它实现了与Lift相同的查询API:

import org.json4s_
导入org.json4s.jackson.JsonMethods_
例如,我们可以使用LINQ风格的API来定义UDF:

val getBs=udf((s:String)=>for{
JString(b)
{"a":[{"b":"value1","d":1},{"b":"value2","d":2}],"c":"valC"}