使用 dask 从 zip 文件读取多个 csv

问题描述 投票:0回答:1

根据this答案,我一直在尝试使用dask从压缩目录中读取多个CSV。但是,我收到一条很长的错误消息,我无法理解。我认为最重要的是这一行:

distributed.protocol.core - CRITICAL - Failed to deserialize

数据是公开的。

import numpy as np
import pandas as pd
import dask.dataframe as dd

# get data
u = "http://www.cepii.fr/DATA_DOWNLOAD/baci/data/BACI_HS92_V202301.zip"

# read data, the dask way
df = dd.read_csv(f'zip://BACI*.csv::{u}', sep=",", dtype={"k":str, "i":int, "j":int, "t":int}, blocksize=None)
df.head()

我相信这种飞越提取应该在 dask 中工作,我不想像 other 答案所建议的那样将所有文件提取到某个目录中。

python dataframe dask
1个回答
1
投票

以下内容是等效的并且有效:

In [1]: u = "http://www.cepii.fr/DATA_DOWNLOAD/baci/data/BACI_HS92_V202301.zip"

In [2]: import numpy as np
   ...: import pandas as pd
   ...: import dask.dataframe as dd
   ...:
   ...: # read data, the dask way
   ...: df = dd.read_csv(f'zip://BACI*.csv::{u}', sep=",", dtype={"k":str, "i":int, "j":int, "t":int})
   ...: df.head()

但是,这很慢,因为 dask 会抢先读取压缩数据块(必须从每个成员文件的开头扫描,因为 DEFLATE 很难)以找到换行符偏移量。

如果添加

blocksize=None
,则前期成本要小得多,因为不需要查找换行符;然而,即使获得
.head()
也需要读取整个第一个压缩文件。此外,它显示第
"q"
列的数据类型不匹配,大概是因为前几行用于猜测的全部都有数字,但后来同一列中出现了对象类型的东西。

kerchunk 项目对在 CSV 中查找和索引换行符感兴趣(https://github.com/fsspec/kerchunk/issues/66)以及索引 ZIP/gzip 文件(https://github.com/fsspec) /kerchunk/issues/281)这意味着一旦某人完成了前期索引工作,就可以快速并行访问这样的数据。此功能尚不存在。

© www.soinside.com 2019 - 2024. All rights reserved.