pyspark 读取复杂JSON以提取键值

u91tlkcl  于 2022-11-01  发布在  Spark
关注(0)|答案(1)|浏览(253)

我有一个JSON,我试图读取它的一部分来提取键和值。假设 response 是我的JSON数据,下面是我的代码:

data_dump = json.dumps(response) 
data = json.loads(data_dump)

在这里,我的数据对象变成了一个列表,我试图获得如下键

id = [key for key in data.keys()]

此操作失败,并显示错误:
一个列表对象没有属性键**。我怎样才能克服这个问题得到下面的输出?
下面是我的JSON:

{
"1": {
    "task": [
        "wakeup",
        "getready"
    ]
},
"2": {
    "task": [
        "brush",
        "shower"
    ]
},
"3": {
    "task": [
        "brush",
        "shower"
    ]
},
"activites": ["standup", "play", "sitdown"],
"statuscheck": {
    "time": 60,
    "color": 1002,
    "change(me)": 9898
},
"action": ["1", "2", "3", "4"]
}

我需要的输出如下所示。我不需要JSON其余部分的数据。
| 标识符|工作|
| - -|- -|
| 一个|起床准备好|
| 2个|淋浴刷|

o7jaxewo

o7jaxewo1#

如果知道需要的键是“1”和“2,”可以尝试将JSON字符串作为 Dataframe 读取,对其进行解透视、分解和分组:

from pyspark.sql import functions as F

df = (spark.read.json(sc.parallelize([data_dump]))
    .selectExpr("stack(2, '1', `1`, '2', `2`) (id, task)")
    .withColumn('task', F.explode('task.task'))
    .groupBy('id').agg(F.collect_list('task').alias('task'))
)
df.show()

# +---+------------------+

# | id|              task|

# +---+------------------+

# |  1|[wakeup, getready]|

# |  2|   [brush, shower]|

# +---+------------------+

然而,在Python中处理它可能更容易:

data = json.loads(data_dump)
data2 = [(k, v['task']) for k, v in data.items() if k in ['1', '2']]
df = spark.createDataFrame(data2, ['id', 'task'])

df.show()

# +---+------------------+

# | id|              task|

# +---+------------------+

# |  1|[wakeup, getready]|

# |  2|   [brush, shower]|

# +---+------------------+

相关问题