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

Explode multiple columns from nested JSON but it is giving extra records

我有一个 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...)中提取 select 个字段。此处重复行的是您要分解 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|
#+----+----+------+----+