如何查询 Arrow 数据集的元数据?是否允许行分区?

How does one query Arrow dataset's metadata? Is row partitioning allowed?

Arrow 的数据集功能对于不断增加的数据库来说是一个很好的工具,即使数据被分区和压缩,人们也希望继续向其中添加更多内容。我已经能够成功地将我的数据分区为我的列,从而使过滤和查询速度更快。但是 Arrow 是否允许按行组进行分区?

文档没有详细解释,我的目标是按行分区,然后能够查询这些分区的元数据[最高值,最低值]。 Arrow 是否允许这样做?

到目前为止我已经尝试过片段

fragments = list(dataset.get_fragments())
fragments[0].split_by_row_group()

然而,这只是让我返回了由柱状分区创建的文件夹结构中的文件。

Parquet 元数据支持存储文件和行组统计信息,其中包含您想要的“最高值”和“最低值”字段。已经讨论过支持类似 IPC 文件的想法,但现在还没有。

您可以使用 read_metadata 查询单个文件的 parquet 元数据。关于返回的元数据的文档不是很全面,但您可以轻松找到行组统计信息。

数据集功能不会向用户公开这些统计信息。但是,数据集功能确实会自动为您使用这些统计数据。您有时会看到此功能被称为“谓词下推”,并且(非常)简短地提到了它 here

为了使用该功能,您需要提供一个过滤器(描述为 here)。例如,假设您进行以下调用。

dataset.to_table(filter=ds.field('c') == 2).to_pandas()
  • 如果在 c 列上有目录分区,那么它将被用来过滤掉哪些文件被读取。
  • 如果列 c 上有行组统计信息(例如 parquet),那么将使用它来过滤出读取了哪些行组。

注意:除了行组之外,parquet 中还有一个概念叫做“数据页”。每个行组的每列可以有多个数据页。这些数据页还可能包含统计信息(取决于作者)。 Arrow 在过滤时(尚未)利用数据页统计信息(参见 ARROW-13998)。

注意:除了上述统计数据之外,还完成了将布隆过滤器添加到 parquet 文件的工作。 Arrow 尚不支持使用这些(请参阅 ARROW-11384)。