Python 使用dask从blob存储上的拼花文件中高效地读取一些列

Python 使用dask从blob存储上的拼花文件中高效地读取一些列,python,dask,parquet,fastparquet,Python,Dask,Parquet,Fastparquet,如何有效地仅读取托管在云blob存储(例如S3/Azure blob存储)中的拼花地板文件的某些列 柱状结构是拼花文件格式的关键优势之一,因此有选择地读取列可以减少I/O负载。将数据存储在blob存储中以在云端上运行大规模工作负载也是很自然的。但是,一旦拼花地板文件存储为blob,大多数库(dask、fastparquet、pyarrow)无法真正利用这一点,因为基本的fseek实际上不可能直接在blob上执行-这意味着无论选择哪列,都必须在读取之前将整个文件下载到本地文件系统 因此,如果我的用

如何有效地仅读取托管在云blob存储(例如S3/Azure blob存储)中的拼花地板文件的某些列

柱状结构是拼花文件格式的关键优势之一,因此有选择地读取列可以减少I/O负载。将数据存储在blob存储中以在云端上运行大规模工作负载也是很自然的。但是,一旦拼花地板文件存储为blob,大多数库(dask、fastparquet、pyarrow)无法真正利用这一点,因为基本的
fseek
实际上不可能直接在blob上执行-这意味着无论选择哪列,都必须在读取之前将整个文件下载到本地文件系统

因此,如果我的用例是这样的,即不同的应用程序需要不同的列,并且仅为几列下载整个文件的性能成本是不可接受的,那么最佳实践是什么?我是否应该为每一列存储不同的拼花地板文件以及一个通用索引,然后在应用程序级别使用pandas/dask等进行合并?ApacheParquet格式是否内置了对按列拆分数据集的支持?类似于hive格式先按分区再按分区拆分数据集的方式

感谢使用dask或fastparquet的任何帮助/具体示例。

(fsspec和fastparquet写作的作者)

简短回答:是的,Dask reading parquet将只从远程存储中选择您需要的列,并且在某些情况下,可以从整个数据集中只读取分区的子部分。后端存储,即使键值(azure blob和datalake、s3、gcsfs)仍然支持范围请求,这意味着工作人员只下载感兴趣的字节

然而,也有一些微妙之处。与磁盘相比,远程存储的延迟(到第一个字节的时间)要高得多,因此数据吞吐量在很大程度上取决于请求的数量:根据采用的预读/缓存策略,查找文件的效率会有所不同

不,对于单独存储列没有特别的支持,尽管在相同的索引上连接通常是有效的。但是,这通常不是必需的,更重要的是要考虑其他因素,例如要使用的正确数据类型和分区大小。这类事情通常取决于具体情况,特定数据存储的延迟可能是一个重要因素