如何阅读 java 中的镶木地板字典

How can I read the parquet dictionary in java

我看到 parquet 格式使用字典来存储一些列,如果在 ParquetReader 上使用 useDictionaryFilter(),这些字典可用于加速过滤器。

有什么方法可以从 java 代码访问这些词典吗?
我想用它们来创建我的列的不同成员的列表,尽管只读取字典值比扫描整个列更快。

我调查了 org.apache.parquet.hadoop.ParquetReader API 但没有找到任何东西。

org.apache.parquet.column.Dictionary 中的方法允许您:

  • 查询字典索引范围:Between 0 and getMaxId().
  • 查找对应于任何索引的条目,例如对于一个int字段你可以使用decodeToInt()

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

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

请注意,一个列块可能包含混合的数据页,一些是字典编码的,一些不是,因为如果字典 "gets full"(达到允许的最大大小),然后写入器输出字典页和字典编码的数据页,并切换到不对其余数据页使用字典编码。