我已经看到拼花格式使用字典来存储一些列,并且如果在useDictionaryFilter()
上使用ParquetReader
,这些字典可以用于加快筛选器的速度。
是否可以通过Java代码访问这些词典?
我想用它们来创建列中不同成员的列表,尽管只读取字典值比扫描整个列要快。
我研究了org.apache.parquet.hadoop.ParquetReader
API,但没有找到任何东西。
答案 0 :(得分:1)
org.apache.parquet.column.Dictionary
中的方法使您可以:
一旦有了Dictionary
,就可以遍历所有索引以获取所有条目,因此问题可以归结为获得Dictionary
。为此,请使用ColumnReaderImpl作为指导:
getDictionary(ColumnDescriptor path, PageReader pageReader) {
DictionaryPage dictionaryPage = pageReader.readDictionaryPage();
if (dictionaryPage != null) {
Dictionary dictionary = dictionaryPage.getEncoding().initDictionary(path, dictionaryPage);
}
}
请注意,列块可能包含数据页的混合,有些是字典编码的,有些则没有,因为如果字典“变满”(达到最大允许大小),那么编写器将输出字典页面和字典编码的数据页,并切换为不对其余数据页使用字典编码。