如何有效地连接多个dask数据框

时间:2019-08-19 23:33:54

标签: dask fastparquet

我有33个多分区数据帧。全部都有其元数据。它们都是用fastparquet制成的。结构看起来像:

- 20190101.parquet
 - _common_metadata
 - _metadata
 - part.0.parquet
 - ....
 - part.n.parquet
- 20190102.parquet
 - _common_metadata
 - _metadata
 - part.0.parquet
 - ....
 - part.n.parquet
- 20190103.parquet
 - _common_metadata
 - _metadata
 - part.0.parquet
 - ....
 - part.n.parquet

我想将所有这些结合在一起。

我目前有:

dfs = []
for date in dates:
    df = dd.read_parquet(f'{date}.parquet', engine='fastparquet')
    dfs.append(df)
df = dd.concat(dfs)

这将返回一个名为“ concat”的简单数据帧,其中包含129,294个任务。

然后我尝试将其写出来:

df.to_parquet('out.parquet', engine='fastparquet')

此最后一次通话永远不会开始工作。那是: *我的笔记本电池正在运行 *繁琐的系统页面显示越来越多的文件描述符,然后变平 *较慢的系统页面显示内存增加,然后仍然增加,但速度较慢 *,但任务不会出现在任务流中

我已经等待了长达1个小时。

(在dask 2.3.0上运行)

2 个答案:

答案 0 :(得分:0)

我衷心希望所有这些都具有一个已排序的索引列,您可以沿着这些列将它们连接在一起。否则,这可能会非常昂贵。

如果他们确实有这样的列,则可能要显式地对其进行调用。

答案 1 :(得分:0)

您只需将文件名数组传递给fastparquet,它将读取为一个文件名,然后将它们加载到dask或pandas数据框中。

这是我读取分散在dask群集上的木地板文件目录的方式

output = ["some list of files..."]
df = client.scatter(dd.read_parquet(output,engine="fastparquet").reset_index().compute())