从嵌套的JSON中分解多个列,但它提供了额外的记录



我有一个JSON文档,如下所示:

{
"Data": [{
"Code": "ABC",
"ID": 123456,
"Type": "Yes",
"Geo": "East"
}, {
"Code": "XYZ",
"ID": 987654,
"Type": "No",
"Geo": "West"
}],
"Total": 2,
"AggregateResults": null,
"Errors": null
}

我的PySpark示例代码:

getjsonresponsedata=json.dumps(getjsondata)
jsonDataList.append(getjsonresponsedata)
jsonRDD = sc.parallelize(jsonDataList)
df_Json=spark.read.json(jsonRDD)
display(df_Json.withColumn("Code",explode(col("Data.Code"))).withColumn("ID",explode(col("Data.ID"))).select('Code','ID'))

当我分解JSON时,我会得到下面的记录(看起来像交叉连接(

Code  ID
ABC   123456
ABC   987654
XYZ   123456
XYZ   987654

但我希望记录如下:

Code  ID
ABC   123456
XYZ   987654

你能帮助我如何得到预期的结果吗?

您只需要分解Data列,就可以从生成的结构列中选择字段(CodeId…(。这里重复的行是分解2个数组Data.CodeData.Id

试试这个:

import pyspark.sql.functions as F
df_Json.withColumn("Data", F.explode("Data")).select("Data.Code", "Data.Id").show()
#+----+------+
#|Code|    Id|
#+----+------+
#| ABC|123456|
#| XYZ|987654|
#+----+------+ 

或者直接在Data阵列上使用inline函数:

df_Json.selectExpr("inline(Data)").show()
#+----+----+------+----+
#|Code| Geo|    ID|Type|
#+----+----+------+----+
#| ABC|East|123456| Yes|
#| XYZ|West|987654|  No|
#+----+----+------+----+

最新更新