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

如何解决我可以通过索引访问 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?