[ https://issues.apache.org/jira/browse/PARQUET-2366?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17779723#comment-17779723 ]
ASF GitHub Bot commented on PARQUET-2366: ----------------------------------------- ConeyLiu commented on code in PR #1174: URL: https://github.com/apache/parquet-mr/pull/1174#discussion_r1372506213 ########## parquet-hadoop/src/main/java/org/apache/parquet/hadoop/IndexCache.java: ########## @@ -0,0 +1,100 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.parquet.hadoop; + +import org.apache.parquet.column.values.bloomfilter.BloomFilter; +import org.apache.parquet.hadoop.metadata.BlockMetaData; +import org.apache.parquet.hadoop.metadata.ColumnChunkMetaData; +import org.apache.parquet.hadoop.metadata.ColumnPath; +import org.apache.parquet.internal.column.columnindex.ColumnIndex; +import org.apache.parquet.internal.column.columnindex.OffsetIndex; + +import java.io.IOException; +import java.util.Set; + +/** + * A cache for caching indexes(including: ColumnIndex, OffsetIndex and BloomFilter) + */ +public interface IndexCache { + + enum CacheStrategy { + NONE, /* No cache */ + PRECACHE_BLOCK /* Precache for block indexes */ + } + + /** + * Create an index cache for the given file reader + * + * @param fileReader the file reader + * @param columns the columns that need to do cache + * @param cacheStrategy the cache strategy, supports NONE and PRECACHE_BLOCK + * @param freeCacheAfterGet whether free the given index cache after calling the given get method + * @return the index cache + */ + static IndexCache create( + ParquetFileReader fileReader, + Set<ColumnPath> columns, + CacheStrategy cacheStrategy, + boolean freeCacheAfterGet) { + if (cacheStrategy == CacheStrategy.NONE) { + return new NoneIndexCache(fileReader); + } else if (cacheStrategy == CacheStrategy.PRECACHE_BLOCK) { + return new PrefetchIndexCache(fileReader, columns, freeCacheAfterGet); Review Comment: renamed > Optimize random seek during rewriting > ------------------------------------- > > Key: PARQUET-2366 > URL: https://issues.apache.org/jira/browse/PARQUET-2366 > Project: Parquet > Issue Type: Improvement > Reporter: Xianyang Liu > Priority: Major > > The `ColunIndex`, `OffsetIndex`, and `BloomFilter` are stored at the end of > the file. We need to randomly seek 4 times when rewriting a column chunk. We > found this could impact the rewrite performance heavily for files with a > number of columns(~1000). In this PR, we read the `ColumnIndex`, > `OffsetIndex`, and `BloomFilter` into a cache to avoid the random seek. We > got about 60 times performance improvement in production environments for the > files with about one thousand columns. -- This message was sent by Atlassian Jira (v8.20.10#820010)