镶木地板指数

Sjo*_*gen 28 indexing parquet

我希望能够在Parquet桌子上进行快速查询.与总大小相比,要返回的数据量非常小,但由于必须执行完整列扫描,因此对于我的用例来说太慢了.

使用索引可以解决这个问题,我读到这将被添加到Parquet 2.0中.但是,我找不到任何其他信息,所以我猜它不是.如果数据被排序的话,我认为没有任何根本障碍阻止添加(多列)索引,在我的情况下是这样.

我的问题是:何时将索引添加到Parquet,以及这样做的高级设计是什么?我想我会对指出正确分区的索引感到满意.

亲切的问候,

Sjoerd.

小智 31

Parquet目前保留每个数据页面的最小/最大统计数据.对于单个列,数据页是一组~1MB的值(在编码之后); 多个页面构成了Parquet的列块.

这些最小/最大值用于过滤列块和构成块的页面.因此,您应该能够通过按要筛选的列对记录进行排序,然后将数据写入Parquet来改善查询时间.这样,您可以充分利用统计信息过滤功能.

您还可以通过减少页面和行组大小来使用此技术进行更精细的过滤,尽管您可以交换编码效率和I/O效率.


Tag*_*gar 21

更新Dec/2018:

Parquet Format版本2.5添加了列索引.

https://github.com/apache/parquet-format/blob/master/CHANGES.md#version-250

有关该新功能的子任务列表,请参阅https://issues.apache.org/jira/browse/PARQUET-1201.

请注意,此功能本身已合并为Parquet格式,不同的后端(Spark,Hive,Impala等)需要一些时间才能开始支持它.

此新功能称为列索引.基本上Parquet在镶木地板布局中添加了两个新结构 - 列索引和偏移索引.

下面是一个更详细的技术说明,它解决了什么以及如何解决.

问题陈述

在当前格式中,为ColumnChunks中的ColumnChunks和DataPageHeader结构中的各个页面存储统计信息.在阅读页面时,读者必须处理页眉以确定是否可以基于统计数据跳过页面.这意味着读者必须访问列中的所有页面,因此可能从磁盘读取大部分列数据.

目标

通过允许基于最小值和最大值直接访问页面,使范围扫描和点查找I/O高效.特别是:

  1. 基于该行组的排序列的行组中的单行查找将仅读取每个检索列的一个数据页.排序列上的范围扫描只需要读取包含相关数据的确切数据页.
  2. 使其他选择性扫描I/O高效:如果我们在非排序列上有非常有选择性的谓词,对于其他检索列,我们只需要访问包含匹配行的数据页.
  3. 没有选择性谓词的扫描没有额外的解码工作,例如,全行组扫描.如果读者确定它不需要读取索引数据,则不会产生任何开销.
  4. 排序列的索引页通过仅存储页之间的边界元素来使用最小存储.

非目标

支持等价的二级索引,即对非键入数据的键值进行排序的索引结构.

技术方法

我们在行组元数据中添加了两个新的每列结构:ColumnIndex:这允许基于列值导航到列的页面,并用于定位包含扫描谓词的匹配值的数据页OffsetIndex:这允许导航行索引,用于通过ColumnIndex检索标识为匹配的行的值.一旦跳过列的行,就必须跳过其他列中的相应行.因此,RowGroup中每列的OffsetIndex都存储在一起.

新的索引结构与页脚附近的RowGroup分开存储,因此如果读取器没有进行选择性扫描,则读取器不需要支付I/O和反序列化成本来读取它们.索引结构的位置和长度存储在ColumnChunk和RowGroup中.

Cloudera的Impala团队已对这一新功能进行了一些测试(尚未作为Apache Impala核心产品的一部分提供).这是他们的性能改进:

字节中的HDFS I/O.

扫描仪CPU时间,以毫秒为单位

正如您所看到的,一些查询在cpu时间和必须从磁盘读取的数据量方面都有了巨大的改进.

2016年的原始答案:

struct IndexPageHeader {
  /** TODO: **/
}
Run Code Online (Sandbox Code Playgroud)

https://github.com/apache/parquet-format/blob/6e5b78d6d23b9730e19b78dceb9aac6166d528b8/src/main/thrift/parquet.thrift#L505

尚未实现索引页面标题.

请参阅上面的Parquet格式的源代码.我目前在Parquet 2.0中也没有看到它.

但是 - 来自Ryan Blue上面在Parquet上的优秀答案,它具有伪索引功能(布隆过滤器).

如果您对更多详细信息感兴趣,我建议使用有关Parquet绽放过滤器和谓词推送工作的精彩文档 https://www.slideshare.net/RyanBlue3/parquet-performance-tuning-the-missing-guide 更多技术特定于实现的文档 - https://homepages.cwi.nl/~boncz/msc/2018-BoudewijnBraams.pdf

  • 还是一样:https://github.com/apache/parquet-format/blob/952c26375eb15c6a27a770f26a6292264b1b7328/src/main/thrift/parquet.thrift#L505 (2认同)