从嵌套 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
列,然后您可以从结果结构列(Code
、Id
...)中提取 select 个字段。此处重复行的是您要分解 2 个数组 Data.Code
和 Data.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|
#+----+----+------+----+
我有一个 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
列,然后您可以从结果结构列(Code
、Id
...)中提取 select 个字段。此处重复行的是您要分解 2 个数组 Data.Code
和 Data.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|
#+----+----+------+----+