如何将pandas DataFrame转为指定格式JSON并存储到HDFS
问题根因
你当前代码的两个问题分别对应两个明确的错误点:
- JSON格式不符合预期:你使用
set_index('id')['weight'].to_dict()生成的是id为键、weight为值的单层字典,结构为{30222:5, 10211:2, 30333:3},和你需要的「元素为包含id、weight两个字段的对象的数组」结构不匹配。 - 抛出文件不存在异常:
TemporaryDirectory上下文管理器只会自动创建根级临时目录,你拼接的my_json是嵌套在临时目录下的子文件夹,没有提前创建的情况下直接往该路径下写文件,就会触发路径不存在的报错。
解决方案
直接按以下逻辑调整代码即可:
- 用pandas自带的
to_dict('records')方法生成符合要求的对象数组结构,不需要手动做索引转换。 - 写文件前调用
os.makedirs递归创建所有不存在的父目录,加上exist_ok=True参数避免目录已存在时报错。 - 本地文件写入完成后直接对接HDFS上传逻辑即可,上下文管理器退出时会自动清理临时目录下的所有文件,不需要手动删除。
完整可运行代码:
import os import json import pandas as pd from tempfile import TemporaryDirectory # 构造示例DataFrame data = [[30222, 5], [10211, 2], [30333, 3]] df = pd.DataFrame(data, columns=['id', 'weight']) with TemporaryDirectory() as tempdir: # 定义本地临时存储路径 temp_local_dir = os.path.join(tempdir, "my_json") temp_local_file = os.path.join(temp_local_dir, "my_json.json") # 创建缺失的父目录 os.makedirs(temp_local_dir, exist_ok=True) # 转换为目标JSON结构并写入文件 json_data = df.to_dict('records') with open(temp_local_file, "w", encoding="utf-8") as f: # 不需要格式化输出可以去掉indent参数,减小文件体积 json.dump(json_data, f, ensure_ascii=False, indent=2) # 此处添加HDFS上传逻辑即可,例如调用hdfs shell命令: # os.system(f"hdfs dfs -put {temp_local_file} /your/hdfs/target/path/")
运行后生成的JSON文件内容和需求完全一致:
[ {"id": 30222, "weight": 5}, {"id": 10211, "weight": 2}, {"id": 30333, "weight": 3} ]
内容的提问来源于stack exchange,提问作者omri
相关产品推荐
相关产品推荐

