Json 从Spark中嵌套的标记数组中提取数据帧

Json 从Spark中嵌套的标记数组中提取数据帧,json,apache-spark,pyspark,apache-spark-sql,Json,Apache Spark,Pyspark,Apache Spark Sql,我使用Spark阅读以下格式的JSON文档: { “项目”:[ {“类型”:“foo”,值:1}, {“类型”:“条”,值:2} ] } 也就是说,数组项由“type”列标记 假设我知道“type”(即{foo,bar})的词汇表,那么如何获得这样的数据帧: root |-- bar: integer (nullable = true) |-- foo: integer (nullable = true) 您可以按如下方式手动管理架构: df2=df.selectExpr(“数组(结构(

我使用Spark阅读以下格式的JSON文档:

{
“项目”:[
{“类型”:“foo”,值:1},
{“类型”:“条”,值:2}
]
}
也就是说,数组项由“type”列标记

假设我知道“type”(即{foo,bar})的词汇表,那么如何获得这样的数据帧:

root
 |-- bar: integer (nullable = true)
 |-- foo: integer (nullable = true)

您可以按如下方式手动管理架构:

df2=df.selectExpr(“数组(结构(项[0]。值为foo,项[1]。值为bar))作为项”) >>>df2.printSchema() 根 |--项目:数组(nullable=false) ||--元素:struct(containsnall=false) || |--foo:long(nullable=true) || |--bar:long(nullable=true) 或者使用
过滤器的更一般的方法:

>df2=df.selectExpr(“数组(结构(过滤器(项目,x->x.type='foo')[0]。值为foo,过滤器(项目,x->x.type='bar')[0]。值为bar))为项目”)
>>>df2.printSchema()
根
|--项目:数组(nullable=false)
||--元素:struct(containsnall=false)
|| |--foo:long(nullable=true)
|| |--bar:long(nullable=true)
或使用
枢轴

df2=df.select(expr(“inline_outer(items)”).groupBy().pivot(“type”).agg( …首先(“价值”) ... ) >>>df2.printSchema() 根 |--条:整数(nullable=true) |--foo:integer(nullable=true)
我想我可以使用
元素\u at
而不是
[0]
来避免在没有匹配条目时出现错误。是的,这是一个很好的想法。我使用第三个选项修改了答案,如中所示。