我正在嘗試決議/展平包含陣列和結構的 JSON 資料。對于“data_array”列中的每個“Id”,我需要從“data_struct”列中獲取“EstValue”。“data_struct”中的列名是實際的 id(來自“data_array”)。盡我所能使用動態連接,但出現錯誤“列不可迭代”。我們不能像在 SQL 中那樣在 PySpark 中使用動態連接條件嗎?有沒有更好的方法來實作這一目標?
JSON 輸入檔案:
{
"data_array": [
{
"id": 1,
"name": "ABC"
},
{
"id": 2,
"name": "DEF"
}
],
"data_struct": {
"1": {
"estimated": {
"value": 123
},
"completed": {
"value": 1234
}
},
"2": {
"estimated": {
"value": 456
},
"completed": {
"value": 4567
}
}
}
}
期望的輸出:
Id Name EstValue CompValue
1 ABC 123 1234
2 DEF 456 4567
我的 PySpark 代碼:
from pyspark.sql.functions import *
rawDF = spark.read.json([f"abfss://{pADLSContainer}@{pADLSGen2}.dfs.core.windows.net/{pADLSDirectory}/InputFile.json"], multiLine = "true")
idDF = rawDF.select(explode("data_array").alias("data_array")) \
.select(col("data_array.id").alias("id"))
idDF.show(n=2,vertical=True,truncate=150)
finalDF = idDF.join(rawDF, (idDF.id == rawDF.select(col("data_struct." idDF.Id))) )
finalDF.show(n=2,vertical=True,truncate=150)
錯誤:
def __iter__(self): raise TypeError("Column is not iterable")
uj5u.com熱心網友回復:
自聯接會產生問題。在這種情況下,您可以避免加入。
您可以從兩列制作陣列,將它們壓縮在一起并用于inline提取到列中。最困難的部分是從“data_struct”列創建陣列。也許有更好的方法,但我只能想到先將其轉換為地圖型別。
輸入:
s = """
{
"data_array": [
{
"id": 1,
"name": "ABC"
},
{
"id": 2,
"name": "DEF"
}
],
"data_struct": {
"1": {
"estimated": {
"value": 123
},
"completed": {
"value": 1234
}
},
"2": {
"estimated": {
"value": 456
},
"completed": {
"value": 4567
}
}
}
}
"""
rawDF = spark.read.json(sc.parallelize([s]), multiLine = "true")
腳本:
id = F.transform('data_array', lambda x: x.id).alias('Id')
name = F.transform('data_array', lambda x: x['name']).alias('Name')
map = F.from_json(F.to_json("data_struct"), 'map<string, struct<estimated:struct<value:long>,completed:struct<value:long>>>')
est_val = F.transform(id, lambda x: map[x].estimated.value).alias('EstValue')
comp_val = F.transform(id, lambda x: map[x].completed.value).alias('CompValue')
df = rawDF.withColumn('y', F.arrays_zip(id, name, est_val, comp_val))
df = df.selectExpr("inline(y)")
df.show()
# --- ---- -------- ---------
# | Id|Name|EstValue|CompValue|
# --- ---- -------- ---------
# | 1| ABC| 123| 1234|
# | 2| DEF| 456| 4567|
# --- ---- -------- ---------
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/519904.html
