Skip to content

Commit b68480b

Browse files
authored
fix: disable parquet dictionary filter by default (bytedance#40)
1 parent 2b46ef0 commit b68480b

3 files changed

Lines changed: 15 additions & 6 deletions

File tree

bolt/connectors/hive/HiveConfig.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -303,8 +303,14 @@ uint8_t HiveConfig::arrowBridgeTimestampUnit(
303303
return session->get<uint8_t>(kArrowBridgeTimestampUnit, 9 /* nano */);
304304
}
305305

306+
// The ParquetDictionaryFilter reads DictionaryPage during query
307+
// execution, which leads to read amplification in TPC-DS benchmark scenarios.
308+
// It is disabled by default, and is only recommended to be enabled manually
309+
// when the dictionary can provide a high filtering rate (i.e., the filter can
310+
// significantly reduce the amount of data that needs to be processed
311+
// subsequently)
306312
bool HiveConfig::isDictionaryFilterEnabled() const {
307-
return config_->get<bool>(kParquetDictionaryFilterEnabled, true);
313+
return config_->get<bool>(kParquetDictionaryFilterEnabled, false);
308314
}
309315

310316
int32_t HiveConfig::decodeRepDefPageCount() const {

bolt/dwio/common/Options.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ class RowReaderOptions {
161161
/// dictionaries
162162
/// against query filters. This can significantly improve performance for
163163
/// selective queries. Defaults to true.
164-
bool enableDictionaryFilter_ = true;
164+
bool enableDictionaryFilter_ = false;
165165

166166
int32_t decodeRepDefPageCount_{10};
167167
int32_t parquetRepDefMemoryLimit_{16UL << 20};

bolt/dwio/parquet/tests/reader/ParquetDictionaryFilterTest.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ class DictionaryFilterTest : public ParquetTestBase {
9999
auto reader =
100100
createReader(filePath_, dwio::common::ReaderOptions{leafPool_.get()});
101101
dwio::common::RowReaderOptions rowReaderOpts;
102+
rowReaderOpts.setEnableDictionaryFilter(true);
102103
rowReaderOpts.setScanSpec(parentSpec);
103104

104105
auto rowReader = reader->createRowReader(rowReaderOpts);
@@ -324,6 +325,7 @@ TEST_F(DictionaryFilterTest, TestMultiColumnFilter) {
324325
int16sSpec->setFilter(common::createBigintValues({0}, true));
325326

326327
dwio::common::RowReaderOptions rowReaderOpts;
328+
rowReaderOpts.setEnableDictionaryFilter(true);
327329
rowReaderOpts.setScanSpec(parentSpec);
328330

329331
auto rowReader = reader->createRowReader(rowReaderOpts);
@@ -512,6 +514,7 @@ TEST_F(DictionaryFilterTest, TestMultiValueDictionaryFilter) {
512514
parentSpec->addField("strings", stringChannel);
513515

514516
dwio::common::RowReaderOptions rowReaderOpts;
517+
rowReaderOpts.setEnableDictionaryFilter(true);
515518
rowReaderOpts.setScanSpec(parentSpec);
516519
auto rowReader = reader->createRowReader(rowReaderOpts);
517520

@@ -555,13 +558,13 @@ TEST_F(DictionaryFilterTest, TestMultiValueDictionaryFilter) {
555558
}
556559

557560
TEST_F(DictionaryFilterTest, RowReaderOptionDefaultValues) {
558-
// Test that dictionary filtering is enabled by default
561+
// Test that dictionary filtering is disabled by default
559562
dwio::common::RowReaderOptions options;
560-
EXPECT_TRUE(options.isDictionaryFilterEnabled());
563+
EXPECT_FALSE(options.isDictionaryFilterEnabled());
561564

562565
// Test disabling dictionary filtering
563-
options.setEnableDictionaryFilter(false);
564-
EXPECT_FALSE(options.isDictionaryFilterEnabled());
566+
options.setEnableDictionaryFilter(true);
567+
EXPECT_TRUE(options.isDictionaryFilterEnabled());
565568
}
566569

567570
TEST_F(DictionaryFilterTest, NonMatchingFilterWithDictionaryFilteringEnabled) {

0 commit comments

Comments
 (0)