Repository navigation
Read promoted Parquet dictionaries natively - #26977
Rich-T-kid wants to merge 3 commits into
Conversation
|
Hosted ClickBench result: #26964 (comment) With dictionary mode enabled on both sides, this change reduced total time from 22.22s to 18.87s (-15.1%) with 3 faster, 0 slower, and 40 unchanged queries in the primary comparison. Q10 improved 198.86ms -> 65.91ms (3.02x), Q11 211.87ms -> 76.34ms (2.78x), and Q23 6146.32ms -> 2992.38ms (2.05x). Peak RSS fell from 12.6 GiB to 11.3 GiB. |
42b286f to
75e94ab
Compare
|
Re-ran the focused ClickBench comparison on the rebased branch using released Arrow 60.1.0. Setup:
Pooled medians:
The profiles now enter the Parquet dictionary decoder directly instead of spending roughly half of CPU time in |
75e94ab to
0b6467f
Compare
|
run benchmark tpch tpcds clickbench_partitioned wide_schema env:
DATAFUSION_RUNTIME_MEMORY_LIMIT: "32G"
DATAFUSION_EXECUTION_PARQUET_ENABLE_RLE_TO_DICTIONARY: "true"
baseline:
ref: "e66caad9042cf570a605da822e480a02845360b9"
changed:
ref: "0b6467ffa88219a4045fb8b8c98a23fc0cb0f8fd" |
|
Benchmark for this request failed before finishing (Kubernetes reason: Benchmarks requested: Runner log (last 40 lines)Kubernetes messageFile an issue against this benchmark runner |
|
🤖 Benchmark running (GKE) | trigger CPU Details (lscpu)Comparing 0b6467f (0b6467f) to e66caad diff Run configurationrun benchmark wide_schema
env:
DATAFUSION_EXECUTION_PARQUET_ENABLE_RLE_TO_DICTIONARY: "true"
DATAFUSION_RUNTIME_MEMORY_LIMIT: "32G"
baseline:
ref: "e66caad9042cf570a605da822e480a02845360b9"
changed:
ref: "0b6467ffa88219a4045fb8b8c98a23fc0cb0f8fd"Results will be posted here when complete File an issue against this benchmark runner |
|
🤖 Benchmark running (GKE) | trigger CPU Details (lscpu)Comparing 0b6467f (0b6467f) to e66caad diff Run configurationrun benchmark tpcds
env:
DATAFUSION_EXECUTION_PARQUET_ENABLE_RLE_TO_DICTIONARY: "true"
DATAFUSION_RUNTIME_MEMORY_LIMIT: "32G"
baseline:
ref: "e66caad9042cf570a605da822e480a02845360b9"
changed:
ref: "0b6467ffa88219a4045fb8b8c98a23fc0cb0f8fd"Results will be posted here when complete File an issue against this benchmark runner |
|
🤖 Benchmark running (GKE) | trigger CPU Details (lscpu)Comparing 0b6467f (0b6467f) to e66caad diff Run configurationrun benchmark tpch
env:
DATAFUSION_EXECUTION_PARQUET_ENABLE_RLE_TO_DICTIONARY: "true"
DATAFUSION_RUNTIME_MEMORY_LIMIT: "32G"
baseline:
ref: "e66caad9042cf570a605da822e480a02845360b9"
changed:
ref: "0b6467ffa88219a4045fb8b8c98a23fc0cb0f8fd"Results will be posted here when complete File an issue against this benchmark runner |
|
run benchmark clickbench_partitioned env:
DATAFUSION_RUNTIME_MEMORY_LIMIT: "32G"
DATAFUSION_EXECUTION_PARQUET_ENABLE_RLE_TO_DICTIONARY: "true"
baseline:
ref: "e66caad9042cf570a605da822e480a02845360b9"
changed:
ref: "0b6467ffa88219a4045fb8b8c98a23fc0cb0f8fd" |
|
🤖 Benchmark running (GKE) | trigger CPU Details (lscpu)Comparing 0b6467f (0b6467f) to e66caad diff Run configurationrun benchmark clickbench_partitioned
env:
DATAFUSION_EXECUTION_PARQUET_ENABLE_RLE_TO_DICTIONARY: "true"
DATAFUSION_RUNTIME_MEMORY_LIMIT: "32G"
baseline:
ref: "e66caad9042cf570a605da822e480a02845360b9"
changed:
ref: "0b6467ffa88219a4045fb8b8c98a23fc0cb0f8fd"Results will be posted here when complete File an issue against this benchmark runner |
|
🤖 Benchmark completed (GKE) | trigger Instance: Comparing 0b6467f (0b6467f) to e66caad diff Run configurationrun benchmark tpch
env:
DATAFUSION_EXECUTION_PARQUET_ENABLE_RLE_TO_DICTIONARY: "true"
DATAFUSION_RUNTIME_MEMORY_LIMIT: "32G"
baseline:
ref: "e66caad9042cf570a605da822e480a02845360b9"
changed:
ref: "0b6467ffa88219a4045fb8b8c98a23fc0cb0f8fd"CPU Details (lscpu)Details
Memory Pool PeaksPeak Base:
Pool accounting vs. process RSS Max pool peak is the largest reservation any single query in the run reached; peak RSS covers the whole invocation, including data loading and allocator retention, and the two high-water marks need not coincide in time. The gap is therefore an upper bound on what the pool did not account for, not a measurement of it.
Resource Usagetpch — base (merge-base)
tpch — branch
File an issue against this benchmark runner |
|
🤖 Benchmark completed (GKE) | trigger Instance: Comparing 0b6467f (0b6467f) to e66caad diff Run configurationrun benchmark tpcds
env:
DATAFUSION_EXECUTION_PARQUET_ENABLE_RLE_TO_DICTIONARY: "true"
DATAFUSION_RUNTIME_MEMORY_LIMIT: "32G"
baseline:
ref: "e66caad9042cf570a605da822e480a02845360b9"
changed:
ref: "0b6467ffa88219a4045fb8b8c98a23fc0cb0f8fd"CPU Details (lscpu)Details
Memory Pool PeaksPeak Base:
Pool accounting vs. process RSS Max pool peak is the largest reservation any single query in the run reached; peak RSS covers the whole invocation, including data loading and allocator retention, and the two high-water marks need not coincide in time. The gap is therefore an upper bound on what the pool did not account for, not a measurement of it.
Resource Usagetpcds — base (merge-base)
tpcds — branch
File an issue against this benchmark runner |
|
run benchmark tpcds env:
DATAFUSION_RUNTIME_MEMORY_LIMIT: "32G"
DATAFUSION_EXECUTION_PARQUET_ENABLE_RLE_TO_DICTIONARY: "true"
baseline:
ref: "e66caad9042cf570a605da822e480a02845360b9"
changed:
ref: "0b6467ffa88219a4045fb8b8c98a23fc0cb0f8fd" |
|
🤖 Benchmark completed (GKE) | trigger Instance: Comparing 0b6467f (0b6467f) to e66caad diff Run configurationrun benchmark clickbench_partitioned
env:
DATAFUSION_EXECUTION_PARQUET_ENABLE_RLE_TO_DICTIONARY: "true"
DATAFUSION_RUNTIME_MEMORY_LIMIT: "32G"
baseline:
ref: "e66caad9042cf570a605da822e480a02845360b9"
changed:
ref: "0b6467ffa88219a4045fb8b8c98a23fc0cb0f8fd"CPU Details (lscpu)Details
Memory Pool PeaksPeak Base:
Pool accounting vs. process RSS Max pool peak is the largest reservation any single query in the run reached; peak RSS covers the whole invocation, including data loading and allocator retention, and the two high-water marks need not coincide in time. The gap is therefore an upper bound on what the pool did not account for, not a measurement of it.
Resource Usageclickbench_partitioned — base (merge-base)
clickbench_partitioned — branch
File an issue against this benchmark runner |
|
🤖 Benchmark running (GKE) | trigger CPU Details (lscpu)Comparing 0b6467f (0b6467f) to e66caad diff Run configurationrun benchmark tpcds
env:
DATAFUSION_EXECUTION_PARQUET_ENABLE_RLE_TO_DICTIONARY: "true"
DATAFUSION_RUNTIME_MEMORY_LIMIT: "32G"
baseline:
ref: "e66caad9042cf570a605da822e480a02845360b9"
changed:
ref: "0b6467ffa88219a4045fb8b8c98a23fc0cb0f8fd"Results will be posted here when complete File an issue against this benchmark runner |
|
🤖 Benchmark completed (GKE) | trigger Instance: Comparing 0b6467f (0b6467f) to e66caad diff Run configurationrun benchmark tpcds
env:
DATAFUSION_EXECUTION_PARQUET_ENABLE_RLE_TO_DICTIONARY: "true"
DATAFUSION_RUNTIME_MEMORY_LIMIT: "32G"
baseline:
ref: "e66caad9042cf570a605da822e480a02845360b9"
changed:
ref: "0b6467ffa88219a4045fb8b8c98a23fc0cb0f8fd"CPU Details (lscpu)Details
Memory Pool PeaksPeak Base:
Pool accounting vs. process RSS Max pool peak is the largest reservation any single query in the run reached; peak RSS covers the whole invocation, including data loading and allocator retention, and the two high-water marks need not coincide in time. The gap is therefore an upper bound on what the pool did not account for, not a measurement of it.
Resource Usagetpcds — base (merge-base)
tpcds — branch
File an issue against this benchmark runner |
|
🤖 Benchmark completed (GKE) | trigger Instance: Comparing 0b6467f (0b6467f) to e66caad diff Run configurationrun benchmark wide_schema
env:
DATAFUSION_EXECUTION_PARQUET_ENABLE_RLE_TO_DICTIONARY: "true"
DATAFUSION_RUNTIME_MEMORY_LIMIT: "32G"
baseline:
ref: "e66caad9042cf570a605da822e480a02845360b9"
changed:
ref: "0b6467ffa88219a4045fb8b8c98a23fc0cb0f8fd"CPU Details (lscpu)Details
Memory Pool PeaksPeak Base:
Pool accounting vs. process RSS Max pool peak is the largest reservation any single query in the run reached; peak RSS covers the whole invocation, including data loading and allocator retention, and the two high-water marks need not coincide in time. The gap is therefore an upper bound on what the pool did not account for, not a measurement of it.
Resource Usagewide_schema — base (merge-base)
wide_schema — branch
File an issue against this benchmark runner |
|
Final exact-SHA benchmark summary (
I also reran the small ClickBench Q41/Q42 outliers over 200 samples per side. They were neutral locally at +0.5% and +0.3%. |
Which issue does this PR close?
Closes #26976. Part of #24111. Depends on #26973.
Why is this needed?
After #26973 excludes columns with plain fallback pages, eligible Parquet columns can still take an avoidable conversion path. Wide-offset dictionaries are read as plain values, and binary columns inferred as strings are dictionary-encoded row by row.
This PR keeps the physical dictionary value type in the reader schema. parquet-rs decodes the keys directly, and the output projection casts the much smaller dictionary values once.
Commits
There is no Arrow patch or dependency override.
Performance
The hosted runs compare #26973 (
e66caad9) with this PR (0b6467ff) using released Arrow 60.1.0 and dictionary reads on both sides.The small hosted Q41/Q42 ClickBench slowdowns did not reproduce over 200 local samples per side (+0.5% and +0.3%).
Testing
cargo test -p datafusion-datasource-parquet --lib(296 tests)cargo clippy -p datafusion-datasource-parquet --all-targets --all-features -- -D warningscargo fmt --all -- --check