PySpark处理含嵌套结构与动态键的JSON并生成高表咨询
问题
需要处理IMF政府债务占GDP比例的JSON数据,将其转换为包含year、country、value列的长表(高表),且方案需支持动态适配新增年份数据。请问如何实现?是否有适用的内置函数,还是必须用循环?
实现方案(以Python + Pandas为例)
这个场景完全不需要写循环,用Pandas的内置函数就能搞定,而且天然支持动态适配新增年份:
1. 拉取并解析JSON数据
import requests import pandas as pd # 拉取数据并解析 resp = requests.get("https://www.imf.org/external/datamapper/api/v1/GG_DEBT_GDP") raw_data = resp.json()
2. 提取核心数据结构
IMF的这个JSON结构固定:data.GG_DEBT_GDP下包含三个关键部分:
countries:国家代码与名称的映射years:所有统计年份的列表values:以国家代码为键、年份数据为值的字典
3. 转宽表再逆透视成长表
# 构建国家名称映射 country_names = {code: name for code, name in raw_data['data']['GG_DEBT_GDP']['countries'].items()} # 提取年份列表和数值数据 years = raw_data['data']['GG_DEBT_GDP']['years'] country_values = raw_data['data']['GG_DEBT_GDP']['values'] # 把数值数据转成宽表(行=国家代码,列=年份) wide_table = pd.DataFrame.from_dict(country_values, orient='index', columns=years) # 添加国家名称列 wide_table['country'] = wide_table.index.map(country_names) # 用melt做逆透视,自动把所有年份列转成year行 long_table = wide_table.melt( id_vars=['country'], var_name='year', value_name='value' ) # 清理空值并格式化年份 long_table = long_table.dropna(subset=['value']) long_table['year'] = long_table['year'].astype(int)
动态性说明
- 代码直接从JSON中读取所有年份和国家,不管后续新增多少年份,只要JSON结构不变,
pd.DataFrame.from_dict和melt会自动识别新增的年份列,无需修改代码。 - 完全避免了循环,效率更高,也更易维护。
非代码方案(Excel Power Query)
如果不想写代码,用Excel内置的Power Query也能实现动态转换:
- 菜单栏「数据」>「获取数据」>「从Web」,输入目标URL导入JSON;
- 逐层展开
data>GG_DEBT_GDP,分别提取countries、years、values; - 将
values转换为表格,选中国家代码列,右键选择「逆透视其他列」; - 关联
countries映射表,替换国家代码为名称,最终得到包含year、country、value的长表; - 后续只需点击「刷新数据」,就能自动加载新增年份的数据。
结论
- 不需要循环,不管用Pandas的
melt还是Excel Power Query的逆透视功能,都是专门处理宽表转长表的内置工具,既能简化实现,又能天然支持动态适配新增数据。 - 核心思路是利用内置工具对数据结构的自动识别,避免手动遍历年份或国家,确保方案的扩展性。
内容的提问来源于stack exchange,提问作者user3696556
相关产品推荐
相关产品推荐

