将多个 parquet 文件中的数据检索到一个数据帧中 (Python)
Retrieving data from multiple parquet files into one dataframe (Python)
首先我想说这是我第一次使用 Parquet 文件。我有一份从 S3 存储桶下载的 2615 个镶木地板文件的列表,我想将它们读入一个数据帧。它们遵循相同的文件夹结构,我在下面举了一个例子:
/Forecasting/as_of_date=2022-02-01/type=full/export_country=Spain/import_country=France/000.parquet'
文件名 000.parquet
始终相同,与文件夹无关。
我使用以下函数保存了所有文件位置:
import os
def list_files(dir):
r = []
for root, dirs, files in os.walk(dir):
for name in files:
r.append(os.path.join(root, name))
return r
这会生成所有文件位置的列表,与上面的文件夹示例完全一样。
接下来我尝试使用 DASK 将所有镶木地板文件读入 dask 数据帧,但它似乎不起作用。
import dask.dataframe as dd
dask_df = dd.read_parquet(data_files)
虽然我知道问题出在哪里,但我一直收到此错误,但我不确定如何解决它。这是因为文件包含列 export_country
和 import_country
,它们也是分区:
ValueError: No partition-columns should be written in the
file unless they are ALL written in the file.
我尝试使用的另一种解决方案是使用 pandas 遍历每个镶木地板文件并将所有内容组合到一个数据帧中。
df = pd.DataFrame()
for f in data_files:
data = pd.read_parquet(f,engine = 'pyarrow')
df = df.append(data)
这似乎需要很长时间,而且我的内核由于没有更多可用 RAM 而死机。
与多次附加相比,执行单个连接更快:
df = pd.concat((pd.read_parquet(f, engine = 'pyarrow') for f in data_files))
但我怀疑它是否有助于内存限制。
我也同意这么多文件的 RAM 限制...
一种“肮脏”的解决方案可能是 data_files 的大块连接,而不是全部连接在一起。
part1 = data_files[:10]
part2 = list[10:20]
part3 = list[20:30]
part4 = list[30:40]
如果你的硬盘上有足够的内存,你可以尝试存储它们,只需附加到一个“大文件”,但我想在加载这个文件的情况下它也会 运行 out-of-memory .
云中有针对如此大量数据和集群的解决方案以及分析它们的工具。只需使用其中一种工具进行数据分析即可。 :)
@Learning 的变体是一团糟的答案,但使用 dd.concat
:
from dask.dataframe import read_parquet, concat
dask_df = concat([read_parquet(f) for f in data_files])
首先我想说这是我第一次使用 Parquet 文件。我有一份从 S3 存储桶下载的 2615 个镶木地板文件的列表,我想将它们读入一个数据帧。它们遵循相同的文件夹结构,我在下面举了一个例子:
/Forecasting/as_of_date=2022-02-01/type=full/export_country=Spain/import_country=France/000.parquet'
文件名 000.parquet
始终相同,与文件夹无关。
我使用以下函数保存了所有文件位置:
import os
def list_files(dir):
r = []
for root, dirs, files in os.walk(dir):
for name in files:
r.append(os.path.join(root, name))
return r
这会生成所有文件位置的列表,与上面的文件夹示例完全一样。
接下来我尝试使用 DASK 将所有镶木地板文件读入 dask 数据帧,但它似乎不起作用。
import dask.dataframe as dd
dask_df = dd.read_parquet(data_files)
虽然我知道问题出在哪里,但我一直收到此错误,但我不确定如何解决它。这是因为文件包含列 export_country
和 import_country
,它们也是分区:
ValueError: No partition-columns should be written in the
file unless they are ALL written in the file.
我尝试使用的另一种解决方案是使用 pandas 遍历每个镶木地板文件并将所有内容组合到一个数据帧中。
df = pd.DataFrame()
for f in data_files:
data = pd.read_parquet(f,engine = 'pyarrow')
df = df.append(data)
这似乎需要很长时间,而且我的内核由于没有更多可用 RAM 而死机。
与多次附加相比,执行单个连接更快:
df = pd.concat((pd.read_parquet(f, engine = 'pyarrow') for f in data_files))
但我怀疑它是否有助于内存限制。
我也同意这么多文件的 RAM 限制... 一种“肮脏”的解决方案可能是 data_files 的大块连接,而不是全部连接在一起。
part1 = data_files[:10]
part2 = list[10:20]
part3 = list[20:30]
part4 = list[30:40]
如果你的硬盘上有足够的内存,你可以尝试存储它们,只需附加到一个“大文件”,但我想在加载这个文件的情况下它也会 运行 out-of-memory .
云中有针对如此大量数据和集群的解决方案以及分析它们的工具。只需使用其中一种工具进行数据分析即可。 :)
@Learning 的变体是一团糟的答案,但使用 dd.concat
:
from dask.dataframe import read_parquet, concat
dask_df = concat([read_parquet(f) for f in data_files])