如何合并文件夹内所有Parquet文件并保留对应元数据?
解决多Parquet文件合并并保留元数据的问题
核心问题分析
你之前的代码存在两个关键问题:
- 元数据DataFrame(
dff)只有1行,而文件数据DataFrame(df)有多行,直接横向合并会导致行数不匹配,元数据只会和第一行对齐,其余行对应列值为NaN - 循环中直接写入CSV时未正确初始化
write_mode和write_header变量,且逐行追加不如先合并所有数据再一次性写入高效
修正后的完整代码
from pathlib import Path import pandas as pd import pyarrow.parquet as pq import json data_dir = Path(r'C:\python\Datas\parq\Merged') processed_dfs = [] for parquet_path in data_dir.glob('*.parquet'): # 读取文件数据 df = pd.read_parquet(parquet_path) # 读取并解析元数据 pt = pq.read_table(parquet_path) meta_own = json.loads(pt.schema.metadata[b'ais']) meta_df = pd.json_normalize(meta_own) # 将元数据广播到和数据行一致的行数,确保每行都带上该文件的元数据 # 方法1:重复元数据行(适用于嵌套元数据结构) meta_expanded = pd.concat([meta_df] * len(df), ignore_index=True) # 方法2:用assign直接添加列(更高效,适合扁平元数据结构) # meta_expanded = df.assign(**meta_df.iloc[0]) # 合并数据和元数据 merged_df = pd.concat([df, meta_expanded], axis=1) processed_dfs.append(merged_df) # 合并所有处理后的DataFrame full_df = pd.concat(processed_dfs, ignore_index=True) # 保存到CSV full_df.to_csv('merged_data_with_metadata.csv', index=False)
关键说明
- 元数据广播:每个Parquet文件的元数据是整个文件的属性,需要让文件内每一行都带上这些元数据,因此通过重复元数据行或
assign方法,确保元数据列和数据行一一对应 - 批量合并:先把所有处理后的DataFrame存入列表,最后一次性合并,比循环中逐次追加CSV更高效,也避免了表头重复写入的问题
- 依赖补全:补充了
pyarrow.parquet和json的导入,解决原代码中pq未定义的报错问题
内容的提问来源于stack exchange,提问作者Dein_coder
相关产品推荐
相关产品推荐

