根据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 答案所建议的那样将所有文件提取到某个目录中。
以下内容是等效的并且有效:
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)这意味着一旦某人完成了前期索引工作,就可以快速并行访问这样的数据。此功能尚不存在。