如何阅读 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"(达到允许的最大大小),然后写入器输出字典页和字典编码的数据页,并切换到不对其余数据页使用字典编码。
我看到 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"(达到允许的最大大小),然后写入器输出字典页和字典编码的数据页,并切换到不对其余数据页使用字典编码。