如何在Java中阅读实木复合地板词典

时间:2018-08-03 12:48:58

标签: dictionary parquet

我已经看到拼花格式使用字典来存储一些列,并且如果在useDictionaryFilter()上使用ParquetReader,这些字典可以用于加快筛选器的速度。

是否可以通过Java代码访问这些词典?
我想用它们来创建列中不同成员的列表,尽管只读取字典值比扫描整个列要快。

我研究了org.apache.parquet.hadoop.ParquetReader API,但没有找到任何东西。

1 个答案:

答案 0 :(得分:1)

org.apache.parquet.column.Dictionary中的方法使您可以:

  • 查询字典索引的范围:0到getMaxId()之间。
  • 查找与任何索引对应的条目,例如对于可以使用decodeToInt()的int字段。

一旦有了Dictionary,就可以遍历所有索引以获取所有条目,因此问题可以归结为获得Dictionary。为此,请使用ColumnReaderImpl作为指导:

getDictionary(ColumnDescriptor path, PageReader pageReader) {
  DictionaryPage dictionaryPage = pageReader.readDictionaryPage();
  if (dictionaryPage != null) {
    Dictionary dictionary = dictionaryPage.getEncoding().initDictionary(path, dictionaryPage);
  }
}

请注意,列块可能包含数据页的混合,有些是字典编码的,有些则没有,因为如果字典“变满”(达到最大允许大小),那么编写器将输出字典页面和字典编码的数据页,并切换为不对其余数据页使用字典编码。