将多个 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')
我有一组 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')