pandas 是否可以更改输出文件名时,保存为分区Parquet?

t3psigkw  于 2023-04-18  发布在  其他
关注(0)|答案(1)|浏览(160)

当我们将pandas数据框保存为分区的parquet时,文件名会自动生成。
是否可以指定每个分区的输出文件名?
用一个例子

df = pd.DataFrame(data={'year':  [2020, 2020, 2021],
                        'month': [1,12,2], 
                        'day':   [1,31,28], 
                        'value': [1000,2000,3000]})

df.to_parquet('./output', partition_cols=['year', 'month'])

output/year=2020/month=1/6f0258e6c48a48dbb56cae0494adf659.parquet
output/year=2020/month=12/cf8a45116d8441668c3a397b816cd5f3.parquet
output/year=2021/month=2/7f9ba3f37cb9417a8689290d3f5f9e6e.parquet

有没有可能得到

output/year=2020/month=1/2020_01.parquet
output/year=2020/month=12/2020_12.parquet
output/year=2021/month=2/2021_02.parquet

谢谢你的时间

llycmphe

llycmphe1#

您可以找到一种方法,将daskpandas一起使用。
将数据保存在pandas中,在写入磁盘时,您可以使用dask通过其name_function参数来处理分区文件的命名约定:

import pandas as pd
import dask.dataframe as dd

df = pd.DataFrame(
   {'year':[2020, 2020, 2021],
   'month': [1,12,2], 
   'day':   [1,31,28], 
   'value': [1000,2000,3000]
})

#--ordering is very important
df = df.sort_values(["year", "month"])

partition_idxs_gen = enumerate(
   map(lambda x: f"{x[0]}_{x[1]}", 
   df[["year","month"]].drop_duplicates().values.tolist()
   )
)
partition_idxs = dict((idx, val) for idx, val in partition_idxs_gen)
ddf = dd.from_pandas(df, chunksize=df.shape[0]) #--single chunk
ddf.to_parquet(
   "my_directory/", 
   compression="snappy", 
   partition_on=["year", "month"], 
   name_function=lambda x: partition_idxs[x]+".parquet"
)

相关问题