我有一个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
…(。这里重复的行是分解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|
#+----+----+------+----+