在PySpark中从DataFrame提取键值并转换格式的实现方法
解决方案(以Pandas为例)
核心思路
不需要提前创建Schema,直接通过数据重塑+JSON解析就能完成转换,步骤清晰直接:
- 将原宽表转为长表,提取原列名作为
ID列 - 解析每个单元格的JSON字符串,提取
todo数组 - 将数组转为逗号分隔的字符串
代码示例
假设已读取的原DataFrame名为df,代码如下:
import pandas as pd import json # 1. 把宽表转成长表:原列名作为ID,单元格内容作为待解析的JSON字符串 melted_df = df.melt(var_name='ID', value_name='json_content') # 2. 解析JSON字符串,提取todo数组并转为逗号分隔的字符串 melted_df['todo'] = melted_df['json_content'].apply( lambda x: ', '.join(json.loads(x)['todo']) ) # 3. 保留目标列,得到最终结果 final_df = melted_df[['ID', 'todo']]
关于Schema的问题
- Pandas场景:完全不需要提前定义Schema,
json.loads会自动解析JSON结构,后续数据转换也无需预定义列结构。 - Spark场景:如果是从JSON文件读取时就想结构化解析,可定义Schema直接读取嵌套结构;但针对已读取完成的DataFrame,同样可以用
from_json函数配合Schema解析单元格JSON,不过非必要。
示例效果
假设原DataFrame为:
| 1 | 2 |
|---|---|
| {"todo": ["买菜", "做饭"]} | {"todo": ["洗碗", "拖地"]} |
转换后的final_df为:
| ID | todo |
|---|---|
| 1 | 买菜, 做饭 |
| 2 | 洗碗, 拖地 |
内容的提问来源于stack exchange,提问作者RData
相关产品推荐
相关产品推荐

