Json 从Spark中嵌套的标记数组中提取数据帧
我使用Spark阅读以下格式的JSON文档: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(“数组(结构(
{
“项目”:[
{“类型”:“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]
来避免在没有匹配条目时出现错误。是的,这是一个很好的想法。我使用第三个选项修改了答案,如中所示。