将多个 CSV 转换为单个分区的镶木地板数据集

Convert multiple CSVs to single partitioned parquet dataset

我有一组 CSV 文件,每个文件对应一年的数据,每个文件都有 YEAR 列。我想将它们转换成单个 parquet 数据集,按年份分区,供以后在 pandas 中使用。问题是所有年份合并的数据框太大,无法放入内存。是否可以逐个迭代地编写镶木地板分区?

我正在使用 fastparquet 作为引擎。

简化的代码示例。此代码会增加内存使用量并导致崩溃。

df = []
for year in range(2000, 2020):
  df.append(pd.read_csv(f'{year}.csv'))
df = pd.concat(df)
df.to_parquet('all_years.pq', partition_cols=['YEAR'])

我试着像这样一个一个写年

for year in range(2000, 2020):
  df = pd.read_csv(f'{year}.csv')
  df.to_parquet('all_years.pq', partition_cols=['YEAR'])

数据文件都在它们各自的 YEAR=XXXX 目录中,但是当我尝试读取这样的数据集时,我只得到了最后一年。也许可以在编写单独的分区后修复 parquet 元数据?

我想我找到了使用 fastparquet.writer.merge() 函数的方法。 Parquet 文件逐年写入,省略 YEAR 列并为其指定适当的名称,然后 merge() 函数创建顶级 _metadata 文件。

下面的代码是一个要点,因为我从我的具体用例中遗漏了很多细节。

years = range(2000, 2020)
for year in years:
  df = pd.read_csv(f'{year}.csv').drop(columns=['YEAR'])
  df.to_parquet(f'all_years.pq/YEAR={year}')
fastparquet.writer.merge([f'all_years.pq/YEAR={y}' for y in years])

df_all = pd.read_parquet('all_years.pq')