如何用Python拆分字典列表并保存为多个Parquet文件(无需Spark)
不用Spark实现单字典转独立Parquet文件的方案
完全可以不依赖Spark实现需求,用pyarrow或pandas就能直接完成单个字典到独立Parquet文件的转换,以下是具体实现方案:
核心思路
你之前使用的pq.write_to_dataset是按指定列分区生成目录存储,本质是批量数据的分区归档,不符合「每个字典对应单个Parquet文件」的需求。正确的做法是遍历每个字典,将其转换为单行数据集后单独写入文件。
完整代码实现
步骤1:处理单份JSON文件
import json import pandas as pd import pyarrow as pa import pyarrow.parquet as pq import os # 1. 读取JSON文件,加载为字典列表 with open("your_data.json", "r", encoding="utf-8") as f: dict_list = json.load(f) # 2. 创建输出目录 output_dir = "single_dict_parquets" os.makedirs(output_dir, exist_ok=True) # 3. 遍历每个字典,单独写入Parquet for idx, item in enumerate(dict_list): # 将单个字典转为单行DataFrame df = pd.DataFrame([item]) # 转为pyarrow Table(比pandas直接写入更高效) table = pa.Table.from_pandas(df) # 生成唯一文件名(用序号+字典内唯一字段如g值命名,避免重复) file_name = f"item_{idx}_{item['g']}.parquet" file_path = os.path.join(output_dir, file_name) # 写入单个Parquet文件 pq.write_table(table, file_path)
步骤2:批量处理多个JSON文件
如果要处理目录下所有JSON文件,只需在外层增加遍历逻辑:
import glob # 遍历目录下所有JSON文件 json_files = glob.glob("path_to_json_dir/*.json") for json_file in json_files: with open(json_file, "r", encoding="utf-8") as f: dict_list = json.load(f) # 用原JSON文件名区分输出的Parquet文件 base_name = os.path.splitext(os.path.basename(json_file))[0] for idx, item in enumerate(dict_list): df = pd.DataFrame([item]) table = pa.Table.from_pandas(df) file_name = f"{base_name}_item_{idx}_{item['g']}.parquet" file_path = os.path.join(output_dir, file_name) pq.write_table(table, file_path)
关键细节说明
- 文件名唯一性:建议使用字典内的唯一标识字段(如示例中的
g时间戳)结合序号命名,避免不同字典生成重复文件名。 - 性能优化:pyarrow的
write_table比pandas的df.to_parquet在小文件写入上更高效;如果字典数量极大,可根据实际场景调整单批处理量,但单字典对应单文件的需求下,单条写入是必须的。 - 字段一致性:确保所有字典的键(字段名)完全一致,否则转换DataFrame时会出现列缺失或额外列的情况,可在转换前统一字段列表规避问题。
内容的提问来源于stack exchange,提问作者stained
相关产品推荐
相关产品推荐

