Python Pandas导出到 parquet ,如何覆盖文件夹输出

kg7wmglp  于 2023-01-12  发布在  Python
关注(0)|答案(1)|浏览(238)

我是Pandas读取一个csv文件,然后将其导出到按日期分区的 parquet ,效果很好

import pandas as pd
import datetime
df = pd.read_csv('box.csv',parse_dates=True)
df['SETTLEMENTDATE'] = pd.to_datetime(df['SETTLEMENTDATE'])
df['Date'] = df['SETTLEMENTDATE'].dt.date
df.to_parquet('nem.parquet',partition_cols=['Date'],allow_truncated_timestamps=True)

这是样本输出

当我再次运行该脚本时,它将生成一个新文件

Pandas中是否有选项覆盖文件,并仅在有新数据时添加新文件?

gojuced7

gojuced71#

今天我在使用带有partition_cols的to_parquet时遇到了这个问题。我的解决方法是运行:

import pandas as pd
import pyarrow as pa
import pyarrow.parquet as pq

df = pd.read_csv('box.csv',parse_dates=True)
df['SETTLEMENTDATE'] = pd.to_datetime(df['SETTLEMENTDATE'])
df['Date'] = df['SETTLEMENTDATE'].dt.date

# convert to pyarrow table
df_pa = pa.Table.from_pandas(df)

pq.write_to_dataset(df_pa,
  root_path = 'nem.parquet',
  partition_cols = ['Date'],
  basename_template = "part-{i}.parquet",
  existing_data_behavior = 'delete_matching')

这里的关键参数是existing_data_behavior,它:
控制数据集如何处理目标中已存在的数据。默认行为为“overwrite_or_ignore”。
“overwrite_or_ignore”将忽略任何现有数据,并覆盖与输出文件同名的文件。其他现有文件将被忽略。此行为与每次写入的唯一basename_template相结合,将允许追加工作流。
如果目标中存在任何数据,则“error”将引发错误。
“delete_matching”在写入分区数据集时很有用。第一次遇到每个分区目录时,将删除整个目录。这使您可以完全覆盖旧分区。仅当use_legacy_dataset=False时才支持此选项。
运行使用:pyarrow==10.0.1

相关问题