我可以通过索引访问 Parquet 文件而不将整个文件读入内存吗?

Has*_*tax 5 parquet fastparquet pyarrow

我刚刚读到 HDF5 允许您访问数据查找,而无需将整个文件读入内存。

这种寻找行为在没有 Java 的 Parquet 文件中是否可能(非 pyspark 解决方案)?我使用 Parquet 是因为它有强大的 dtype 支持。

import h5py

f = h5py.File('my_file.hdf5', 'w')
dset = f.create_dataset('coords', data=my_ndarray)
f.close()

f = h5py.File('my_file.hdf5', 'r')
dset = f['coords']
my_array = dset[-2:]
Run Code Online (Sandbox Code Playgroud)

https://arrow.apache.org/docs/python/parquet.html#inspecting-the-parquet-file-metadata

我在这里看到 Parquet 元数据具有num_row_groups: 1 (or more). 但我不确定这如何帮助我获取行 [23, 42, 117, 99293184]。

Pac*_*ace 4

Parquet 允许某些形式的部分/随机访问。然而,它是有限的。每个 Parquet 文件由一个或多个行组组成,每个 Parquet 文件由一个或多个列组成。您可以检索所需的行组和列的任意组合。

只有一种方法可以在 parquet 文件中存储列。但是,如何将行分配到行组中取决于文件的创建者。创建者可以将每一行放入其自己的行组中(尽管这效率太低),或者他们可以选择对整个文件使用一个行组(这很常见)。

这意味着进行部分读取的能力将取决于文件的创建方式。如果您正在创建文件并且您提前知道将进行哪些类型的读取来访问数据,则可以使用它来创建行组。如果您事先不知道访问模式,或者无法控制正在读取的文件的创建,那么您可能必须将整个文件读入内存并稍后进行过滤。

另一个常见的场景是跨多个文件存储单个大型数据集(以便每个文件中都有一些行)。这允许您从多个行组中获得相同类型的部分读取行为。然而,拥有多个文件有时更容易管理。

pyarrow 和 fastparquet 都应该为您提供用于过滤行组的 API。它们还公开 parquet 文件元数据,以便您可以自己访问元数据信息以实现某些自定义过滤机制。