另存为分区镶木地板时是否可以更改输出文件名?

big*_*add 5 python dataframe pandas parquet

当我们将 pandas 数据框保存为分区镶木地板时,文件名会自动生成。

是否可以指定每个分区的输出文件名?

使用示例

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
Run Code Online (Sandbox Code Playgroud)

是否可以得到

output/year=2020/month=1/2020_01.parquet
output/year=2020/month=12/2020_12.parquet
output/year=2021/month=2/2021_02.parquet
Run Code Online (Sandbox Code Playgroud)

谢谢你的时间

kha*_*han 1

您可以找到一种解决方法,使用daskwith pandas。

将数据保存在 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"
)
Run Code Online (Sandbox Code Playgroud)