【问题标题】:How does one query Arrow dataset's metadata? Is row partitioning allowed?如何查询 Arrow 数据集的元数据?是否允许行分区?
【发布时间】:2021-09-13 20:20:41
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 你能解释一下'按行分区'是什么意思吗?根据您的描述,您可能需要/想要一个 group_by 运算符来聚合每个列,然后计算此类分组的最小值/最大值。这就是说,据我所知,Arrow 中还没有聚合/归约运算符。
  • 我们可以如何指定partition_cols,我的理解是我们可以按行来做同样的事情。例如,如果我有跨越多天的数据,按日期对它们进行分区会非​​常有帮助,这样我就可以直接从元数据中查询最小值和最大值,groupby 绝对是一个很好的选择,但我希望可以存储这些值在写入文件而不是派生帖子时读取所有数据
  • 我认为这就是我的误解的来源:在您的示例中,我假设您的数据将有一个类似 date 或类似的列。这样,如果您将partition_cols 设置为date parquet 会将文件保存在date 子文件夹中,每个子文件夹仅包含该特定日期的数据。然后您应该能够阅读每天的最小值/最大值。

标签: parquet pyarrow


【解决方案1】:

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

您可以使用 read_metadata 查询单个文件的 parquet 元数据。围绕返回的元数据的文档不是很丰富,但您可以很容易地找到行组统计信息。

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

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

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

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

注意:除了上面提到的统计数据之外,还有一些工作是将布隆过滤器添加到镶木地板文件中。 Arrow 尚不支持使用这些(请参阅ARROW-11384)。

【讨论】:

  • 再次感谢佩斯,您对镶木地板的了解非常有帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-08
相关资源
最近更新 更多