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)
谢谢你的时间
您可以找到一种解决方法,使用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)