Pandas写入带分区列的Parquet元数据时schema不一致报错如何解决
错误原因
当你指定partition_cols参数写入Parquet数据集时,pyarrow会将指定的分区列从实际存储的Parquet文件Schema中移除,分区列的值仅通过目录路径进行存储。你后续手动写入元数据时传入的是原始表的Schema(包含A、B、C三个分区列),但metadata_collector中收集的所有分区文件的元数据对应的Schema均不包含这三个分区列,二者Schema不一致直接触发了报错。
没有指定partition_cols时,文件Schema和原始表Schema完全一致,所以不会报错。
解决方案
方案1:开启自动写入元数据参数(推荐)
pyarrow 7.0及以上版本中,pq.write_to_dataset提供了write_dataset_metadata参数,直接设置为True即可自动生成_common_metadata和_metadata文件,无需手动编写元数据写入逻辑,避免Schema匹配错误:
df = pd.DataFrame(dictReprForDf) table = pa.Table.from_pandas(df) pq.write_to_dataset( table, outputFilePath, partition_cols=['A','B','C'], write_dataset_metadata=True )
方案2:手动写入元数据时使用正确的Schema
如果需要手动控制元数据写入流程,需要先构建剔除了分区列的存储Schema,再用该Schema写入元数据:
df = pd.DataFrame(dictReprForDf) table = pa.Table.from_pandas(df) metadata_collector = [] # 写入数据集 pq.write_to_dataset( table, outputFilePath, metadata_collector=metadata_collector, partition_cols=['A','B','C'] ) # 构建剔除分区列的存储Schema storage_schema = pa.schema([col for col in table.schema if col.name not in ['A','B','C']]) # 用存储Schema写入元数据 pq.write_metadata(storage_schema, outputFilePath+'/_common_metadata') pq.write_metadata(storage_schema, outputFilePath+'/_metadata', metadata_collector=metadata_collector)
内容的提问来源于stack exchange,提问作者user7571075
相关产品推荐
相关产品推荐

