使用PageIndex,为什么镶木地板不会跳过不必要的页面?

时间:2019-06-17 15:38:41

标签: parquet parquet-mr

使用parquet-mr@1.11.0,我有一个架构,例如:

schema message page {
  required binary url (STRING);
  optional binary content (STRING);
}
  • 我正在通过url进行单行查找,以检索关联的content
  • 行按url排序。

该文件是通过以下方式创建的:

  • parquet.block.size:256 MB
  • parquet.page.size:10 MB

使用parquet-tools,我可以验证自己确实具有列索引和/或列偏移量:

column index for column url:
Boudary order: ASCENDING
                      null count  min                                       max
page-0                         0  http://materiais.(...)delos-de-curriculo  https://api.quero(...)954874/toogle_like
page-1                         0  https://api.quero(...)880/toogle_dislike  https://api.quero(...)ior-online/encceja
page-2                         0  https://api.quero(...)erior-online/todos  https://api.quero(...)nte-em-saude/todos

offset index for column url:
                          offset   compressed size       first row index
page-0                         4            224274                     0
page-1                    224278            100168                 20000
page-2                    324446             67778                 40000


column index for column content:
NONE
offset index for column content:
                          offset   compressed size       first row index
page-0                    392224            504412                     0
page-1                    896636            784246                   125
page-2                   1680882            641212                   200
page-3                   2322094            684826                   275
[... truncated ...]
page-596               256651848            183162                 53100

使用配置为:的阅读器

   AvroParquetReader
      .<GenericRecord>builder(HadoopInputFile.fromPath(path, conf))
      .withFilter(FilterCompat.get(
        FilterApi.eq(
          FilterApi.binaryColumn(urlKey),
          Binary.fromString(url)
        )
      ))
      .withConf(conf)
      .build();

感谢column-indexcolumn-offsets,我希望读者只能阅读2页:

  • 其中包含url个与min/max匹配的列索引。
  • 然后,其中包含使用偏移量索引的content的匹配行索引。

但是我看到的是读者正在为content列读取和解码数百页(〜250MB),我是否缺少有关PageIndex应该如何在parquet-mr中工作的东西?

查找“正在加载页面”和“跳过记录”日志行,这是在将过滤器应用于url之前试图建立整个记录,我认为这违反了PageIndex的目的。

我试图上网寻找读者的工作方式,但找不到任何东西。

修改

我在parquet-column上发现了从2015年开始的PR,暗示当前的读者(至少在当时)确实在使用谓词之前使用所有必需的列来构建整个记录:

https://github.com/apache/parquet-mr/pull/288

但是在这种情况下,我看不到column offsets的目的。

1 个答案:

答案 0 :(得分:1)

发现,即使这不是我期望阅读的the specs,它仍然可以正常工作。

this issue中,我引用:

  

列URL有3页。您的过滤器发现第0页匹配。基于偏移量索引,它将转换为行范围[0..19999]。因此,我们需要为页面网址加载page-0,并且所有页面的行内容都在[0..19999]行范围内。