繁体   English   中英

将多个镶木地板文件中的数据检索到一个 dataframe (Python)

[英]Retrieving data from multiple parquet files into one dataframe (Python)

首先我想说这是我第一次使用 Parquet 文件。 我有一个从 S3 存储桶下载的 2615 个镶木地板文件的列表,我想将它们读入一个 dataframe。它们遵循相同的文件夹结构,我在下面举了一个例子:

/Forecasting/as_of_date=2022-02-01/type=full/export_country=Spain/import_country=France/000.parquet'

文件名000.parquet始终相同,与文件夹无关。

我使用以下 function 保存了所有文件位置:

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 dataframe 但它似乎不起作用。

import dask.dataframe as dd
dask_df = dd.read_parquet(data_files)

我不断收到此错误,但我不确定如何解决它,尽管我知道问题出在哪里。 这是因为文件包含列export_countryimport_country ,它们也是分区:

ValueError: No partition-columns should be written in the 
file unless they are ALL written in the file.

我尝试使用的另一种解决方案是使用 pandas 遍历每个镶木地板文件,并将所有内容组合成一个 dataframe。

df = pd.DataFrame()
for f in data_files:
    data = pd.read_parquet(f,engine = 'pyarrow')
    df = df.append(data)

这似乎需要很长时间,我的 kernel 由于没有更多可用 RAM 而死机。

与多次 append 相比,执行单个连接更快:

df = pd.concat((pd.read_parquet(f, engine = 'pyarrow') for f in data_files))

但我怀疑它是否有助于 memory 限制。

@Learning 的变体是一团糟的答案,但使用dd.concat

from dask.dataframe import read_parquet, concat
dask_df = concat([read_parquet(f) for f in data_files])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM