加载具有不同列选择的多个镶木地板文件

dask loading multiple parquet files with different column selections

我想使用 Dask 从存储在不同目录中的许多镶木地板文件中加载特定列,并且每个镶木地板需要加载不同的列。我想使用 Dask,这样我就可以在一台机器上使用多个内核。我看到了如何将文件列表或通配符传递给 dd.read_parquet 以指示多个文件(例如 *.parquet),但我没有看到传递不同的列集以供每个文件读取的方法.我想知道这是否可以使用 dask.delayed.

来完成

我的具体情况是:

我将大型单细胞基因表达数据集(~30,000 rows/genes x ~10,000 columns/cells)作为镶木地板文件存储在不同的目录中。每个目录都有两个 parquet 文件 1) 大基因表达数据(细胞作为列)和 2) 细胞元数据(细胞作为行,细胞元数据作为列)。我正在使用较小的元数据镶木地板文件来查找较大文件中需要的 columns/cells。例如,我将使用元数据 parquet 文件查找属于特定单元格类型的所有单元格,然后仅加载较大文件中的那些单元格。我可以使用 Pandas 来执行此操作,但我想使用 Dask 进行并行处理。

如果您可以使用 Pandas .read_parquet, while specifying columns 执行此操作(请参阅最后一个代码示例),那么一种可能的方法是通过替换

来延迟现有的 Pandas-specific 方法
pd.read_parquet(..., columns=[list_of_cols])

来自

dask.delayed(pd.read_parquet)(..., columns=[list_of_cols])

正如您所建议的那样。

编辑

我必须对成对 .csv 文件的单个目录执行类似的操作 - 元数据和相应的光谱。我的过滤逻辑很少,所以我创建了一个 Python 字典,它的键是元数据逻辑(生成文件名),值是列列表。我遍历了字典 key-value paris 和

  • 使用 dd.read_csv(..., columns=[list_of_cols])
  • 从关联的光谱文件中读取相应的列列表
  • ddf 附加到一个空白列表(显然后跟 dd.concat() 以在循环后将它们垂直连接在一起)

不过,就我而言,元数据内容以可预测的方式更改,这就是为什么我可以使用 dictionary comprehension.

以编程方式 assemble 字典的原因