有效地从Blob存储上的镶木地板文件中读取某些列

时间:2019-12-01 21:36:55

标签: apache-spark pyspark dask parquet fastparquet

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

柱状结构是镶木地板文件格式的主要优点之一,因此,有选择地读取列可以减少I / O负载。将数据存储在Blob存储中以在云上运行大规模工作负载也是很自然的。但是,一旦将镶木地板文件存储为Blob,大多数库(黄昏,快速镶木地板,Pyarrow)就无法真正利用此功能,因为底层fseek不可能直接在Blob上实现-这意味着无论在选择哪几列之前,必须先将整个文件下载到本地文件系统中。

如果我的用例使得单独的应用程序需要不同的列,而仅下载几列就下载整个文件的性能成本是不可接受的,那么最佳实践是什么?我是否应该为每个列存储不同的拼花文件以及一个公共索引,然后使用pandas / dask等在应用程序级别合并? apache格式是否具有内置支持,可按列拆分数据集-类似于配置单元格式如何先分区再分区?

任何帮助/具体示例表示赞赏。我的应用程序使用了dask(当然是通过Python),但是使用Spark等类似的有趣示例也可能会有所帮助。

1 个答案:

答案 0 :(得分:2)

(fsspec和fastparquet编写的作者)

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

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

否,虽然通常应该对相同的索引进行连接,但是对单独存储列没有特别的支持。但是,通常没有必要,更重要的是其他注意事项,例如要使用的数据类型和分区大小。这些情况通常取决于大小写,并且特定数据存储的延迟可能是一个重要因素。