我有一个JSON,我正在尝试读取其中的一部分以提取键和值。假设响应是我的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其余部分的数据。
id | 任务 |
---|---|
1 | 唤醒,准备好 |
2 | 刷子,淋浴 |
如果您知道您需要的密钥是"1〃;以及";2〃;,您可以尝试将JSON字符串作为数据帧读取、取消对其进行分解和分组:
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]|
# +---+------------------+