如何使用 fsspec+adlfs 加快从 adl:// 读取 CSV/Parquet 文件的速度?

Posted

技术标签:

【中文标题】如何使用 fsspec+adlfs 加快从 adl:// 读取 CSV/Parquet 文件的速度?【英文标题】:How can I speed up reading a CSV/Parquet file from adl:// with fsspec+adlfs? 【发布时间】:2020-03-12 00:33:00 【问题描述】:

我在 Azure Data Lake 中有一个数 GB 的 CSV 文件。使用 Dask,我可以在一分钟内读取此文件,如下所示:

>>> import dask.dataframe as dd
>>> adl_path = 'adl://...'
>>> df = dd.read_csv(adl_path, storage_options=...)
>>> len(df.compute())

但是,我不想将它读入 Dask 或 Pandas DataFrame —— 我想直接访问底层文件。 (目前是 CSV,但我也希望能够处理 Parquet 文件。)所以我也在尝试使用adlfs 0.2.0:

>>> import fsspec
>>> adl = fsspec.filesystem('adl', store_name='...', tenant_id=...)
>>> lines = 0
>>> with adl.open(adl_path) as fh:
>>>    for line in fh:
>>>        lines += 1

在与 Dask 进程相同的时间内,此方法仅读取了 0.1% 的输入。

我尝试过使用fsspec 的缓存,认为这会在the initial caching 完成后加快访问速度:

>>> fs = fsspec.filesystem("filecache", target_protocol='adl', target_options=..., cache_storage='/tmp/files/')
>>> fs.exists(adl_path) # False
>>> fs.size(adl_path) # FileNotFoundError

>>> # Using a relative path instead of fully-qualified (FQ) path:
>>> abs_adl_path = 'absolute/path/to/my/file.csv'
>>> fs.exists(abs_adl_path) # True
>>> fs.size(abs_adl_path) # 1234567890 -- correct size in bytes
>>> fs.get(abs_adl_path, local_path) # FileNotFoundError
>>> handle = fs.open(abs_adl_path) # FileNotFoundError

有没有一种高效的方法可以远程读取 CSV(以及 Parquet)作为普通 Python 文件句柄首先作为 Dask DataFrame 加载?

【问题讨论】:

【参考方案1】:

我不知道为什么fs.get 不起作用,但请在最后一行试试这个:

handle = fs.open(adl_path)

即,您打开原始路径,但您在“/tmp/files/”的某处获得本地文件的文件句柄(一旦完成复制)。

【讨论】:

使用完全限定名称(即adl://...)也不起作用。我在其他示例中使用不合格的绝对路径只是因为它们确实有效。 .exists.size 都适用于绝对路径,但不适用于 FQ 路径。 FQ 路径不适用于我尝试过的任何方法。 github.com/intake/filesystem_spec/pull/245 - 请在合并后尝试从 master 安装(很快) 我是从master安装的。奇怪的是,我现在得到了fs.size(abs_adl_path) == 4next(fsspec.filesystem("filecache", target_protocol='adl', target_options=...).open(abs_adl_file)) == b'test'。不确定这个 test 值来自哪里 - 它不在我的文件中。 可能是 /tmp/files 中的旧内容? /tmp/files 中有两个文件:cache 包含一些编码数据,包括我的文件的路径。 (我假设“测试”在那里。)还有另一个文件正好包含“测试”。但是,如果我删除这些文件并重新运行,它们会被重新创建。

以上是关于如何使用 fsspec+adlfs 加快从 adl:// 读取 CSV/Parquet 文件的速度?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 xarray 的后端添加 fsspec.open_local

如何从 ADLS 将自定义数据框写入 eventthub

使用 Databricks 将文件从 Azure 文件移动到 ADLS Gen 2 并返回

使用 Python 或 Java 从本地将数据上传到 Azure ADLS Gen2

我们如何修复 ADLS Gen 2 中的增量位置文件

是否可以将数据从 ADLS 加载到 DBX 中的 SQL DW?