如何解决我可以通过索引访问 Parquet 文件而不将整个文件读入内存吗?
我刚刚读到 HDF5 允许您访问数据,而无需将整个文件读入内存。
在没有 Java(非 pyspark 解决方案)的 Parquet 文件中,这种搜索行为是否可行?由于强大的 dtype 支持,我正在使用 Parquet。
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:]
https://arrow.apache.org/docs/python/parquet.html#inspecting-the-parquet-file-metadata
我在这里看到 Parquet 元数据有 num_row_groups: 1 (or more)
。但我不确定这如何帮助我获取行 [23、42、117、99293184]。
解决方法
Parquet 允许某些形式的部分/随机访问。然而,它是有限的。每个镶木地板文件由一个或多个行组组成,每个镶木地板文件由一个或多个列组成。您可以检索所需的行组和列的任意组合。
在镶木地板文件中存储列的方法只有一种。但是,如何将行分布到行组中取决于文件的创建者。创建者可以将每一行放在自己的行组中(尽管这样做效率太低),也可以选择为整个文件使用一个行组(这很常见)。
这意味着部分读取的能力将取决于文件的创建方式。如果您正在创建文件并且您提前知道将要进行哪些类型的读取来访问数据,您可以使用它来创建行组。如果您事先不知道访问模式,或者您无法控制正在读取的文件的创建,那么您可能必须将整个文件读入内存并稍后进行过滤。
另一种常见情况是跨多个文件存储单个大型数据集(以便每个文件中都有一些行)。这允许您从多个行组中获得相同类型的部分读取行为。但是,拥有多个文件有时更容易管理。
pyarrow 和 fastparquet 都应该为您提供用于过滤行组的 API。它们还公开了 Parquet 文件元数据,以便您可以自己访问元数据信息以实现一些自定义过滤机制。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。