This is an automated email from the ASF dual-hosted git repository.
LuciferYang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/spark.git
The following commit(s) were added to refs/heads/master by this push:
new c13302acc2a8 Revert "[SPARK-56892][SQL] Bulk read optimization for
Parquet DELTA_BINARY_PACKED decoding"
c13302acc2a8 is described below
commit c13302acc2a80003a0aac8b81a63170cded83937
Author: yangjie01 <[email protected]>
AuthorDate: Tue Jun 16 15:24:50 2026 +0800
Revert "[SPARK-56892][SQL] Bulk read optimization for Parquet
DELTA_BINARY_PACKED decoding"
This reverts commit 03750ab553d9ebf446e61e077e867d45436f72b0.
---
...ectorizedDeltaReaderBenchmark-jdk21-results.txt | 98 +++++++------
...ectorizedDeltaReaderBenchmark-jdk25-results.txt | 98 +++++++------
.../VectorizedDeltaReaderBenchmark-results.txt | 98 +++++++------
.../datasources/parquet/ParquetDictionary.java | 4 +-
.../parquet/ParquetVectorUpdaterFactory.java | 11 +-
.../parquet/VectorizedDeltaBinaryPackedReader.java | 151 +--------------------
.../datasources/parquet/VectorizedReaderBase.java | 38 ------
.../parquet/VectorizedDeltaReaderBenchmark.scala | 10 +-
8 files changed, 157 insertions(+), 351 deletions(-)
diff --git
a/sql/core/benchmarks/VectorizedDeltaReaderBenchmark-jdk21-results.txt
b/sql/core/benchmarks/VectorizedDeltaReaderBenchmark-jdk21-results.txt
index 9f0397dd4d8b..a7199750be60 100644
--- a/sql/core/benchmarks/VectorizedDeltaReaderBenchmark-jdk21-results.txt
+++ b/sql/core/benchmarks/VectorizedDeltaReaderBenchmark-jdk21-results.txt
@@ -2,94 +2,92 @@
DELTA_BINARY_PACKED INT32
================================================================================================
-OpenJDK 64-Bit Server VM 21.0.11+10-LTS on Linux 6.17.0-1018-azure
+OpenJDK 64-Bit Server VM 21.0.11+10-LTS on Linux 6.17.0-1011-azure
AMD EPYC 7763 64-Core Processor
DELTA_BINARY_PACKED INT32: Best Time(ms) Avg Time(ms)
Stdev(ms) Rate(M/s) Per Row(ns) Relative
------------------------------------------------------------------------------------------------------------------------
-readIntegers, constant 2 2
0 476.2 2.1 1.0X
-skipIntegers, constant 2 2
0 561.5 1.8 1.2X
-readIntegers, monotonic 2 2
0 480.9 2.1 1.0X
-skipIntegers, monotonic 2 2
0 562.4 1.8 1.2X
-readIntegers, small-delta random 3 3
0 330.9 3.0 0.7X
-skipIntegers, small-delta random 3 3
0 376.2 2.7 0.8X
-readIntegers, wide random 4 4
0 268.4 3.7 0.6X
-skipIntegers, wide random 4 4
0 293.1 3.4 0.6X
+readIntegers, constant 2 2
0 451.8 2.2 1.0X
+skipIntegers, constant 3 3
0 415.1 2.4 0.9X
+readIntegers, monotonic 3 3
0 369.7 2.7 0.8X
+skipIntegers, monotonic 3 3
0 415.6 2.4 0.9X
+readIntegers, small-delta random 3 3
0 308.6 3.2 0.7X
+skipIntegers, small-delta random 3 3
0 358.6 2.8 0.8X
+readIntegers, wide random 4 4
0 249.2 4.0 0.6X
+skipIntegers, wide random 4 4
0 281.4 3.6 0.6X
================================================================================================
DELTA_BINARY_PACKED INT64
================================================================================================
-OpenJDK 64-Bit Server VM 21.0.11+10-LTS on Linux 6.17.0-1018-azure
+OpenJDK 64-Bit Server VM 21.0.11+10-LTS on Linux 6.17.0-1011-azure
AMD EPYC 7763 64-Core Processor
DELTA_BINARY_PACKED INT64: Best Time(ms) Avg Time(ms)
Stdev(ms) Rate(M/s) Per Row(ns) Relative
------------------------------------------------------------------------------------------------------------------------
-readLongs, constant 2 2
0 518.5 1.9 1.0X
-skipLongs, constant 2 2
0 545.8 1.8 1.1X
-readLongs, monotonic 2 2
0 517.6 1.9 1.0X
-skipLongs, monotonic 2 2
0 559.7 1.8 1.1X
-readLongs, small-delta random 3 3
0 357.3 2.8 0.7X
-skipLongs, small-delta random 3 3
0 377.0 2.7 0.7X
-readLongs, wide random 6 6
0 186.1 5.4 0.4X
-skipLongs, wide random 5 6
0 190.7 5.2 0.4X
+readLongs, constant 5 6
0 195.2 5.1 1.0X
+skipLongs, constant 6 6
0 175.4 5.7 0.9X
+readLongs, monotonic 7 7
0 158.8 6.3 0.8X
+skipLongs, monotonic 6 6
0 175.6 5.7 0.9X
+readLongs, small-delta random 8 8
0 139.4 7.2 0.7X
+skipLongs, small-delta random 7 7
0 152.5 6.6 0.8X
+readLongs, wide random 10 10
1 102.9 9.7 0.5X
+skipLongs, wide random 6 9
2 185.5 5.4 1.0X
================================================================================================
DELTA_BYTE_ARRAY
================================================================================================
-OpenJDK 64-Bit Server VM 21.0.11+10-LTS on Linux 6.17.0-1018-azure
+OpenJDK 64-Bit Server VM 21.0.11+10-LTS on Linux 6.17.0-1011-azure
AMD EPYC 7763 64-Core Processor
DELTA_BYTE_ARRAY: Best Time(ms) Avg Time(ms)
Stdev(ms) Rate(M/s) Per Row(ns) Relative
------------------------------------------------------------------------------------------------------------------------
-readBinary, no overlap, len=16 27 32
2 38.2 26.2 1.0X
-skipBinary, no overlap, len=16 34 36
2 30.8 32.5 0.8X
-readBinary, half overlap, len=16 33 34
0 31.5 31.7 0.8X
-skipBinary, half overlap, len=16 38 39
1 27.7 36.1 0.7X
-readBinary, full overlap, len=16 33 34
1 31.5 31.7 0.8X
-skipBinary, full overlap, len=16 38 39
2 27.4 36.5 0.7X
-readBinary, half overlap, len=64 33 34
1 31.6 31.7 0.8X
-skipBinary, half overlap, len=64 38 39
2 27.9 35.8 0.7X
+readBinary, no overlap, len=16 35 41
4 29.6 33.8 1.0X
+skipBinary, no overlap, len=16 41 45
3 25.9 38.6 0.9X
+readBinary, half overlap, len=16 41 44
3 25.4 39.3 0.9X
+skipBinary, half overlap, len=16 47 50
5 22.3 44.8 0.8X
+readBinary, full overlap, len=16 42 44
3 25.1 39.9 0.8X
+skipBinary, full overlap, len=16 48 50
3 22.0 45.6 0.7X
+readBinary, half overlap, len=64 42 42
1 25.2 39.6 0.9X
+skipBinary, half overlap, len=64 47 50
14 22.4 44.6 0.8X
================================================================================================
DELTA_LENGTH_BYTE_ARRAY
================================================================================================
-OpenJDK 64-Bit Server VM 21.0.11+10-LTS on Linux 6.17.0-1018-azure
+OpenJDK 64-Bit Server VM 21.0.11+10-LTS on Linux 6.17.0-1011-azure
AMD EPYC 7763 64-Core Processor
DELTA_LENGTH_BYTE_ARRAY: Best Time(ms) Avg Time(ms)
Stdev(ms) Rate(M/s) Per Row(ns) Relative
------------------------------------------------------------------------------------------------------------------------
-readBinary, payloadLen=8 16 16
0 65.7 15.2 1.0X
-skipBinary, payloadLen=8 6 6
0 184.2 5.4 2.8X
-readBinary, payloadLen=32 16 16
1 65.0 15.4 1.0X
-skipBinary, payloadLen=32 6 6
0 185.6 5.4 2.8X
-readBinary, payloadLen=128 18 19
1 56.9 17.6 0.9X
-skipBinary, payloadLen=128 6 6
0 185.6 5.4 2.8X
-readBinary, payloadLen=512 39 40
1 27.1 36.9 0.4X
-skipBinary, payloadLen=512 6 6
0 185.5 5.4 2.8X
+readBinary, payloadLen=8 20 21
0 51.7 19.3 1.0X
+skipBinary, payloadLen=8 10 10
0 106.3 9.4 2.1X
+readBinary, payloadLen=32 16 18
2 63.9 15.7 1.2X
+skipBinary, payloadLen=32 6 6
0 175.9 5.7 3.4X
+readBinary, payloadLen=128 19 19
0 56.0 17.8 1.1X
+skipBinary, payloadLen=128 6 6
0 176.3 5.7 3.4X
+readBinary, payloadLen=512 41 43
3 25.6 39.0 0.5X
+skipBinary, payloadLen=512 6 6
1 176.4 5.7 3.4X
================================================================================================
Variant reads
================================================================================================
-OpenJDK 64-Bit Server VM 21.0.11+10-LTS on Linux 6.17.0-1018-azure
+OpenJDK 64-Bit Server VM 21.0.11+10-LTS on Linux 6.17.0-1011-azure
AMD EPYC 7763 64-Core Processor
Variant reads: Best Time(ms) Avg Time(ms)
Stdev(ms) Rate(M/s) Per Row(ns) Relative
-------------------------------------------------------------------------------------------------------------------------------
-readBytes (INT32) 4 4
0 236.3 4.2 1.0X
-readShorts (INT32) 9 9
2 117.6 8.5 0.5X
-readUnsignedIntegers (INT32 -> Long) 9 9
1 117.6 8.5 0.5X
-readIntegersAsLongs (INT32 -> Long) 4 4
0 286.8 3.5 1.2X
-readIntegersAsDoubles (INT32 -> Double) 4 4
0 258.1 3.9 1.1X
-readUnsignedLongs (INT64 -> Decimal(20,0)) 28 29
0 36.9 27.1 0.2X
-skipBytes 6 6
0 175.1 5.7 0.7X
-skipShorts 6 6
1 175.4 5.7 0.7X
-readByte (INT32 single-value) 14 14
1 76.5 13.1 0.3X
-readShort (INT32 single-value) 14 14
0 76.6 13.1 0.3X
-readInteger (INT32 single-value) 14 14
0 76.6 13.1 0.3X
-readLong (INT64 single-value) 16 16
0 67.3 14.9 0.3X
-readBinary(len) (DELTA_BYTE_ARRAY single-value) 63 65
2 16.6 60.2 0.1X
+readBytes (INT32) 7 7
0 142.3 7.0 1.0X
+readShorts (INT32) 7 8
0 143.0 7.0 1.0X
+readUnsignedIntegers (INT32 -> Long) 7 7
0 147.1 6.8 1.0X
+readUnsignedLongs (INT64 -> Decimal(20,0)) 232 243
23 4.5 221.5 0.0X
+skipBytes 4 4
0 285.4 3.5 2.0X
+skipShorts 4 4
0 285.4 3.5 2.0X
+readByte (INT32 single-value) 13 13
1 80.2 12.5 0.6X
+readShort (INT32 single-value) 13 13
1 82.0 12.2 0.6X
+readInteger (INT32 single-value) 13 13
0 80.2 12.5 0.6X
+readLong (INT64 single-value) 14 14
0 74.9 13.3 0.5X
+readBinary(len) (DELTA_BYTE_ARRAY single-value) 64 67
3 16.5 60.6 0.1X
diff --git
a/sql/core/benchmarks/VectorizedDeltaReaderBenchmark-jdk25-results.txt
b/sql/core/benchmarks/VectorizedDeltaReaderBenchmark-jdk25-results.txt
index ef6274f71249..fe7b64c3834b 100644
--- a/sql/core/benchmarks/VectorizedDeltaReaderBenchmark-jdk25-results.txt
+++ b/sql/core/benchmarks/VectorizedDeltaReaderBenchmark-jdk25-results.txt
@@ -2,94 +2,92 @@
DELTA_BINARY_PACKED INT32
================================================================================================
-OpenJDK 64-Bit Server VM 25.0.3+9-LTS on Linux 6.17.0-1018-azure
+OpenJDK 64-Bit Server VM 25.0.3+9-LTS on Linux 6.17.0-1010-azure
AMD EPYC 7763 64-Core Processor
DELTA_BINARY_PACKED INT32: Best Time(ms) Avg Time(ms)
Stdev(ms) Rate(M/s) Per Row(ns) Relative
------------------------------------------------------------------------------------------------------------------------
-readIntegers, constant 2 2
0 473.1 2.1 1.0X
-skipIntegers, constant 2 2
0 604.4 1.7 1.3X
-readIntegers, monotonic 2 2
0 473.5 2.1 1.0X
-skipIntegers, monotonic 2 2
0 607.2 1.6 1.3X
-readIntegers, small-delta random 3 3
0 333.4 3.0 0.7X
-skipIntegers, small-delta random 3 3
0 391.2 2.6 0.8X
-readIntegers, wide random 4 4
0 271.5 3.7 0.6X
-skipIntegers, wide random 4 4
0 294.7 3.4 0.6X
+readIntegers, constant 2 2
0 487.1 2.1 1.0X
+skipIntegers, constant 3 3
0 364.8 2.7 0.7X
+readIntegers, monotonic 3 4
0 303.1 3.3 0.6X
+skipIntegers, monotonic 3 3
0 365.3 2.7 0.7X
+readIntegers, small-delta random 4 4
0 241.3 4.1 0.5X
+skipIntegers, small-delta random 4 4
0 278.7 3.6 0.6X
+readIntegers, wide random 5 5
0 201.4 5.0 0.4X
+skipIntegers, wide random 5 5
0 225.6 4.4 0.5X
================================================================================================
DELTA_BINARY_PACKED INT64
================================================================================================
-OpenJDK 64-Bit Server VM 25.0.3+9-LTS on Linux 6.17.0-1018-azure
+OpenJDK 64-Bit Server VM 25.0.3+9-LTS on Linux 6.17.0-1010-azure
AMD EPYC 7763 64-Core Processor
DELTA_BINARY_PACKED INT64: Best Time(ms) Avg Time(ms)
Stdev(ms) Rate(M/s) Per Row(ns) Relative
------------------------------------------------------------------------------------------------------------------------
-readLongs, constant 2 2
0 497.0 2.0 1.0X
-skipLongs, constant 2 2
0 583.4 1.7 1.2X
-readLongs, monotonic 2 2
0 496.7 2.0 1.0X
-skipLongs, monotonic 2 2
0 588.6 1.7 1.2X
-readLongs, small-delta random 3 3
0 342.8 2.9 0.7X
-skipLongs, small-delta random 3 3
0 392.5 2.5 0.8X
-readLongs, wide random 6 6
0 189.2 5.3 0.4X
-skipLongs, wide random 5 5
0 197.4 5.1 0.4X
+readLongs, constant 6 7
1 163.0 6.1 1.0X
+skipLongs, constant 7 7
0 152.1 6.6 0.9X
+readLongs, monotonic 8 8
1 139.1 7.2 0.9X
+skipLongs, monotonic 7 7
0 152.0 6.6 0.9X
+readLongs, small-delta random 9 9
0 122.7 8.2 0.8X
+skipLongs, small-delta random 8 8
0 133.9 7.5 0.8X
+readLongs, wide random 11 11
0 94.4 10.6 0.6X
+skipLongs, wide random 10 10
0 100.9 9.9 0.6X
================================================================================================
DELTA_BYTE_ARRAY
================================================================================================
-OpenJDK 64-Bit Server VM 25.0.3+9-LTS on Linux 6.17.0-1018-azure
+OpenJDK 64-Bit Server VM 25.0.3+9-LTS on Linux 6.17.0-1010-azure
AMD EPYC 7763 64-Core Processor
DELTA_BYTE_ARRAY: Best Time(ms) Avg Time(ms)
Stdev(ms) Rate(M/s) Per Row(ns) Relative
------------------------------------------------------------------------------------------------------------------------
-readBinary, no overlap, len=16 27 31
3 38.3 26.1 1.0X
-skipBinary, no overlap, len=16 32 32
0 33.2 30.2 0.9X
-readBinary, half overlap, len=16 33 34
1 31.5 31.7 0.8X
-skipBinary, half overlap, len=16 38 39
1 27.6 36.2 0.7X
-readBinary, full overlap, len=16 34 34
1 31.2 32.1 0.8X
-skipBinary, full overlap, len=16 38 39
1 27.3 36.7 0.7X
-readBinary, half overlap, len=64 34 35
1 30.5 32.7 0.8X
-skipBinary, half overlap, len=64 38 39
1 27.6 36.2 0.7X
+readBinary, no overlap, len=16 37 38
2 28.2 35.5 1.0X
+skipBinary, no overlap, len=16 42 43
2 25.2 39.7 0.9X
+readBinary, half overlap, len=16 43 44
2 24.3 41.2 0.9X
+skipBinary, half overlap, len=16 48 49
2 21.8 45.9 0.8X
+readBinary, full overlap, len=16 44 47
4 24.0 41.7 0.9X
+skipBinary, full overlap, len=16 48 50
2 21.6 46.3 0.8X
+readBinary, half overlap, len=64 44 45
2 23.8 42.0 0.8X
+skipBinary, half overlap, len=64 49 53
4 21.6 46.3 0.8X
================================================================================================
DELTA_LENGTH_BYTE_ARRAY
================================================================================================
-OpenJDK 64-Bit Server VM 25.0.3+9-LTS on Linux 6.17.0-1018-azure
+OpenJDK 64-Bit Server VM 25.0.3+9-LTS on Linux 6.17.0-1010-azure
AMD EPYC 7763 64-Core Processor
DELTA_LENGTH_BYTE_ARRAY: Best Time(ms) Avg Time(ms)
Stdev(ms) Rate(M/s) Per Row(ns) Relative
------------------------------------------------------------------------------------------------------------------------
-readBinary, payloadLen=8 16 17
1 63.7 15.7 1.0X
-skipBinary, payloadLen=8 6 6
0 182.4 5.5 2.9X
-readBinary, payloadLen=32 16 17
1 64.5 15.5 1.0X
-skipBinary, payloadLen=32 6 6
0 182.7 5.5 2.9X
-readBinary, payloadLen=128 19 19
1 55.7 18.0 0.9X
-skipBinary, payloadLen=128 6 6
0 182.4 5.5 2.9X
-readBinary, payloadLen=512 42 43
1 25.1 39.8 0.4X
-skipBinary, payloadLen=512 6 6
0 182.7 5.5 2.9X
+readBinary, payloadLen=8 22 22
0 48.7 20.5 1.0X
+skipBinary, payloadLen=8 11 11
0 97.0 10.3 2.0X
+readBinary, payloadLen=32 21 22
0 48.9 20.5 1.0X
+skipBinary, payloadLen=32 11 11
0 97.0 10.3 2.0X
+readBinary, payloadLen=128 24 24
1 43.7 22.9 0.9X
+skipBinary, payloadLen=128 11 11
1 97.1 10.3 2.0X
+readBinary, payloadLen=512 51 53
1 20.5 48.7 0.4X
+skipBinary, payloadLen=512 11 11
0 97.1 10.3 2.0X
================================================================================================
Variant reads
================================================================================================
-OpenJDK 64-Bit Server VM 25.0.3+9-LTS on Linux 6.17.0-1018-azure
+OpenJDK 64-Bit Server VM 25.0.3+9-LTS on Linux 6.17.0-1010-azure
AMD EPYC 7763 64-Core Processor
Variant reads: Best Time(ms) Avg Time(ms)
Stdev(ms) Rate(M/s) Per Row(ns) Relative
-------------------------------------------------------------------------------------------------------------------------------
-readBytes (INT32) 5 5
0 211.3 4.7 1.0X
-readShorts (INT32) 9 9
1 120.9 8.3 0.6X
-readUnsignedIntegers (INT32 -> Long) 10 10
0 105.8 9.5 0.5X
-readIntegersAsLongs (INT32 -> Long) 4 4
0 283.9 3.5 1.3X
-readIntegersAsDoubles (INT32 -> Double) 4 4
0 253.0 4.0 1.2X
-readUnsignedLongs (INT64 -> Decimal(20,0)) 28 29
0 36.8 27.2 0.2X
-skipBytes 6 6
0 166.5 6.0 0.8X
-skipShorts 6 6
0 166.8 6.0 0.8X
-readByte (INT32 single-value) 12 12
0 86.2 11.6 0.4X
-readShort (INT32 single-value) 13 13
1 81.6 12.3 0.4X
-readInteger (INT32 single-value) 14 14
0 74.7 13.4 0.4X
-readLong (INT64 single-value) 16 16
1 66.9 14.9 0.3X
-readBinary(len) (DELTA_BYTE_ARRAY single-value) 64 66
3 16.3 61.3 0.1X
+readBytes (INT32) 9 10
1 115.6 8.6 1.0X
+readShorts (INT32) 9 10
1 116.0 8.6 1.0X
+readUnsignedIntegers (INT32 -> Long) 9 9
1 117.1 8.5 1.0X
+readUnsignedLongs (INT64 -> Decimal(20,0)) 211 223
27 5.0 201.5 0.0X
+skipBytes 9 9
0 122.2 8.2 1.1X
+skipShorts 9 9
0 122.3 8.2 1.1X
+readByte (INT32 single-value) 13 13
0 80.1 12.5 0.7X
+readShort (INT32 single-value) 14 15
1 72.7 13.7 0.6X
+readInteger (INT32 single-value) 14 15
0 72.9 13.7 0.6X
+readLong (INT64 single-value) 16 17
1 64.3 15.6 0.6X
+readBinary(len) (DELTA_BYTE_ARRAY single-value) 79 81
2 13.3 74.9 0.1X
diff --git a/sql/core/benchmarks/VectorizedDeltaReaderBenchmark-results.txt
b/sql/core/benchmarks/VectorizedDeltaReaderBenchmark-results.txt
index b3dc35eea94e..9ff1678901e9 100644
--- a/sql/core/benchmarks/VectorizedDeltaReaderBenchmark-results.txt
+++ b/sql/core/benchmarks/VectorizedDeltaReaderBenchmark-results.txt
@@ -2,94 +2,92 @@
DELTA_BINARY_PACKED INT32
================================================================================================
-OpenJDK 64-Bit Server VM 17.0.19+10-LTS on Linux 6.17.0-1018-azure
+OpenJDK 64-Bit Server VM 17.0.19+10-LTS on Linux 6.17.0-1011-azure
AMD EPYC 7763 64-Core Processor
DELTA_BINARY_PACKED INT32: Best Time(ms) Avg Time(ms)
Stdev(ms) Rate(M/s) Per Row(ns) Relative
------------------------------------------------------------------------------------------------------------------------
-readIntegers, constant 3 3
0 374.8 2.7 1.0X
-skipIntegers, constant 2 2
0 612.8 1.6 1.6X
-readIntegers, monotonic 3 3
0 374.3 2.7 1.0X
-skipIntegers, monotonic 2 2
0 612.0 1.6 1.6X
-readIntegers, small-delta random 4 4
0 297.3 3.4 0.8X
-skipIntegers, small-delta random 2 3
0 426.7 2.3 1.1X
-readIntegers, wide random 4 4
0 240.3 4.2 0.6X
-skipIntegers, wide random 3 3
0 307.3 3.3 0.8X
+readIntegers, constant 2 2
0 482.3 2.1 1.0X
+skipIntegers, constant 3 3
0 335.4 3.0 0.7X
+readIntegers, monotonic 3 3
0 314.9 3.2 0.7X
+skipIntegers, monotonic 3 3
0 335.1 3.0 0.7X
+readIntegers, small-delta random 4 4
0 257.5 3.9 0.5X
+skipIntegers, small-delta random 4 4
0 269.5 3.7 0.6X
+readIntegers, wide random 5 5
0 209.3 4.8 0.4X
+skipIntegers, wide random 5 5
0 218.2 4.6 0.5X
================================================================================================
DELTA_BINARY_PACKED INT64
================================================================================================
-OpenJDK 64-Bit Server VM 17.0.19+10-LTS on Linux 6.17.0-1018-azure
+OpenJDK 64-Bit Server VM 17.0.19+10-LTS on Linux 6.17.0-1011-azure
AMD EPYC 7763 64-Core Processor
DELTA_BINARY_PACKED INT64: Best Time(ms) Avg Time(ms)
Stdev(ms) Rate(M/s) Per Row(ns) Relative
------------------------------------------------------------------------------------------------------------------------
-readLongs, constant 2 2
0 535.0 1.9 1.0X
-skipLongs, constant 2 2
0 607.1 1.6 1.1X
-readLongs, monotonic 2 2
0 536.2 1.9 1.0X
-skipLongs, monotonic 2 2
0 605.8 1.7 1.1X
-readLongs, small-delta random 3 3
0 367.0 2.7 0.7X
-skipLongs, small-delta random 2 2
0 426.4 2.3 0.8X
-readLongs, wide random 6 6
0 187.1 5.3 0.3X
-skipLongs, wide random 5 5
0 194.8 5.1 0.4X
+readLongs, constant 5 6
1 191.0 5.2 1.0X
+skipLongs, constant 6 6
0 170.1 5.9 0.9X
+readLongs, monotonic 7 7
0 144.9 6.9 0.8X
+skipLongs, monotonic 6 6
0 170.1 5.9 0.9X
+readLongs, small-delta random 8 8
0 134.8 7.4 0.7X
+skipLongs, small-delta random 7 7
0 152.8 6.5 0.8X
+readLongs, wide random 11 11
0 97.8 10.2 0.5X
+skipLongs, wide random 10 10
0 106.4 9.4 0.6X
================================================================================================
DELTA_BYTE_ARRAY
================================================================================================
-OpenJDK 64-Bit Server VM 17.0.19+10-LTS on Linux 6.17.0-1018-azure
+OpenJDK 64-Bit Server VM 17.0.19+10-LTS on Linux 6.17.0-1011-azure
AMD EPYC 7763 64-Core Processor
DELTA_BYTE_ARRAY: Best Time(ms) Avg Time(ms)
Stdev(ms) Rate(M/s) Per Row(ns) Relative
------------------------------------------------------------------------------------------------------------------------
-readBinary, no overlap, len=16 27 28
1 38.6 25.9 1.0X
-skipBinary, no overlap, len=16 32 33
1 32.8 30.5 0.8X
-readBinary, half overlap, len=16 33 34
1 31.4 31.8 0.8X
-skipBinary, half overlap, len=16 39 40
1 26.9 37.2 0.7X
-readBinary, full overlap, len=16 34 35
0 30.5 32.8 0.8X
-skipBinary, full overlap, len=16 40 40
0 26.4 37.9 0.7X
-readBinary, half overlap, len=64 35 35
0 30.3 33.0 0.8X
-skipBinary, half overlap, len=64 39 40
1 26.6 37.6 0.7X
+readBinary, no overlap, len=16 36 37
1 29.2 34.2 1.0X
+skipBinary, no overlap, len=16 41 41
1 25.8 38.7 0.9X
+readBinary, half overlap, len=16 42 43
1 25.0 39.9 0.9X
+skipBinary, half overlap, len=16 48 50
2 21.6 46.2 0.7X
+readBinary, full overlap, len=16 42 44
2 24.8 40.3 0.8X
+skipBinary, full overlap, len=16 48 49
1 21.8 45.9 0.7X
+readBinary, half overlap, len=64 42 44
1 24.8 40.4 0.8X
+skipBinary, half overlap, len=64 47 49
1 22.2 45.1 0.8X
================================================================================================
DELTA_LENGTH_BYTE_ARRAY
================================================================================================
-OpenJDK 64-Bit Server VM 17.0.19+10-LTS on Linux 6.17.0-1018-azure
+OpenJDK 64-Bit Server VM 17.0.19+10-LTS on Linux 6.17.0-1011-azure
AMD EPYC 7763 64-Core Processor
DELTA_LENGTH_BYTE_ARRAY: Best Time(ms) Avg Time(ms)
Stdev(ms) Rate(M/s) Per Row(ns) Relative
------------------------------------------------------------------------------------------------------------------------
-readBinary, payloadLen=8 17 19
2 63.1 15.9 1.0X
-skipBinary, payloadLen=8 6 6
0 175.2 5.7 2.8X
-readBinary, payloadLen=32 17 17
1 62.3 16.0 1.0X
-skipBinary, payloadLen=32 6 6
0 175.3 5.7 2.8X
-readBinary, payloadLen=128 19 19
0 55.1 18.1 0.9X
-skipBinary, payloadLen=128 6 6
1 174.9 5.7 2.8X
-readBinary, payloadLen=512 38 40
1 27.2 36.7 0.4X
-skipBinary, payloadLen=512 6 6
0 174.8 5.7 2.8X
+readBinary, payloadLen=8 22 25
2 48.1 20.8 1.0X
+skipBinary, payloadLen=8 11 12
1 95.8 10.4 2.0X
+readBinary, payloadLen=32 22 26
3 48.0 20.9 1.0X
+skipBinary, payloadLen=32 11 12
1 97.6 10.2 2.0X
+readBinary, payloadLen=128 26 29
2 40.0 25.0 0.8X
+skipBinary, payloadLen=128 11 12
1 96.0 10.4 2.0X
+readBinary, payloadLen=512 54 62
4 19.3 51.9 0.4X
+skipBinary, payloadLen=512 11 13
2 95.7 10.4 2.0X
================================================================================================
Variant reads
================================================================================================
-OpenJDK 64-Bit Server VM 17.0.19+10-LTS on Linux 6.17.0-1018-azure
+OpenJDK 64-Bit Server VM 17.0.19+10-LTS on Linux 6.17.0-1011-azure
AMD EPYC 7763 64-Core Processor
Variant reads: Best Time(ms) Avg Time(ms)
Stdev(ms) Rate(M/s) Per Row(ns) Relative
-------------------------------------------------------------------------------------------------------------------------------
-readBytes (INT32) 5 5
0 202.0 5.0 1.0X
-readShorts (INT32) 9 9
0 115.1 8.7 0.6X
-readUnsignedIntegers (INT32 -> Long) 9 9
0 121.4 8.2 0.6X
-readIntegersAsLongs (INT32 -> Long) 4 4
0 291.1 3.4 1.4X
-readIntegersAsDoubles (INT32 -> Double) 4 4
0 258.8 3.9 1.3X
-readUnsignedLongs (INT64 -> Decimal(20,0)) 28 28
0 37.6 26.6 0.2X
-skipBytes 6 7
1 165.5 6.0 0.8X
-skipShorts 7 7
0 158.4 6.3 0.8X
-readByte (INT32 single-value) 14 14
0 75.4 13.3 0.4X
-readShort (INT32 single-value) 14 14
0 75.4 13.3 0.4X
-readInteger (INT32 single-value) 14 14
0 75.4 13.3 0.4X
-readLong (INT64 single-value) 15 16
0 68.1 14.7 0.3X
-readBinary(len) (DELTA_BYTE_ARRAY single-value) 62 64
1 17.0 58.7 0.1X
+readBytes (INT32) 7 7
0 145.8 6.9 1.0X
+readShorts (INT32) 7 8
1 140.7 7.1 1.0X
+readUnsignedIntegers (INT32 -> Long) 7 7
0 143.3 7.0 1.0X
+readUnsignedLongs (INT64 -> Decimal(20,0)) 227 239
25 4.6 216.4 0.0X
+skipBytes 8 8
0 136.8 7.3 0.9X
+skipShorts 8 8
0 136.6 7.3 0.9X
+readByte (INT32 single-value) 12 12
1 85.8 11.7 0.6X
+readShort (INT32 single-value) 12 12
0 85.9 11.6 0.6X
+readInteger (INT32 single-value) 12 12
0 86.1 11.6 0.6X
+readLong (INT64 single-value) 14 15
1 73.4 13.6 0.5X
+readBinary(len) (DELTA_BYTE_ARRAY single-value) 71 77
5 14.7 68.2 0.1X
diff --git
a/sql/core/src/main/java/org/apache/spark/sql/execution/datasources/parquet/ParquetDictionary.java
b/sql/core/src/main/java/org/apache/spark/sql/execution/datasources/parquet/ParquetDictionary.java
index aba5e1996a2e..ffdb94ee3765 100644
---
a/sql/core/src/main/java/org/apache/spark/sql/execution/datasources/parquet/ParquetDictionary.java
+++
b/sql/core/src/main/java/org/apache/spark/sql/execution/datasources/parquet/ParquetDictionary.java
@@ -19,6 +19,8 @@ package org.apache.spark.sql.execution.datasources.parquet;
import org.apache.spark.sql.execution.vectorized.Dictionary;
+import java.math.BigInteger;
+
public final class ParquetDictionary implements Dictionary {
private org.apache.parquet.column.Dictionary dictionary;
private boolean needTransform = false;
@@ -66,7 +68,7 @@ public final class ParquetDictionary implements Dictionary {
// whenever dictionary is available.
// Here we lazily decode it to the original signed long value then
convert to decimal(20, 0).
long signed = dictionary.decodeToLong(id);
- return VectorizedReaderBase.unsignedLongToBytesBigEndian(signed);
+ return new BigInteger(Long.toUnsignedString(signed)).toByteArray();
} else {
return dictionary.decodeToBinary(id).getBytesUnsafe();
}
diff --git
a/sql/core/src/main/java/org/apache/spark/sql/execution/datasources/parquet/ParquetVectorUpdaterFactory.java
b/sql/core/src/main/java/org/apache/spark/sql/execution/datasources/parquet/ParquetVectorUpdaterFactory.java
index 8a72d2e5e731..90e4c3e04f81 100644
---
a/sql/core/src/main/java/org/apache/spark/sql/execution/datasources/parquet/ParquetVectorUpdaterFactory.java
+++
b/sql/core/src/main/java/org/apache/spark/sql/execution/datasources/parquet/ParquetVectorUpdaterFactory.java
@@ -717,8 +717,6 @@ public class ParquetVectorUpdaterFactory {
}
private static class UnsignedLongUpdater implements ParquetVectorUpdater {
- private final byte[] unsignedLongScratch = new byte[9];
-
@Override
public void readValues(
int total,
@@ -738,9 +736,8 @@ public class ParquetVectorUpdaterFactory {
int offset,
WritableColumnVector values,
VectorizedValuesReader valuesReader) {
- int start = VectorizedReaderBase.encodeUnsignedLongBigEndian(
- valuesReader.readLong(), unsignedLongScratch);
- values.putByteArray(offset, unsignedLongScratch, start, 9 - start);
+ byte[] bytes = new
BigInteger(Long.toUnsignedString(valuesReader.readLong())).toByteArray();
+ values.putByteArray(offset, bytes);
}
@Override
@@ -750,8 +747,8 @@ public class ParquetVectorUpdaterFactory {
WritableColumnVector dictionaryIds,
Dictionary dictionary) {
long signed = dictionary.decodeToLong(dictionaryIds.getDictId(offset));
- int start = VectorizedReaderBase.encodeUnsignedLongBigEndian(signed,
unsignedLongScratch);
- values.putByteArray(offset, unsignedLongScratch, start, 9 - start);
+ byte[] unsigned = new
BigInteger(Long.toUnsignedString(signed)).toByteArray();
+ values.putByteArray(offset, unsigned);
}
}
diff --git
a/sql/core/src/main/java/org/apache/spark/sql/execution/datasources/parquet/VectorizedDeltaBinaryPackedReader.java
b/sql/core/src/main/java/org/apache/spark/sql/execution/datasources/parquet/VectorizedDeltaBinaryPackedReader.java
index 6abea3b40066..7b56e1ebf239 100644
---
a/sql/core/src/main/java/org/apache/spark/sql/execution/datasources/parquet/VectorizedDeltaBinaryPackedReader.java
+++
b/sql/core/src/main/java/org/apache/spark/sql/execution/datasources/parquet/VectorizedDeltaBinaryPackedReader.java
@@ -17,6 +17,7 @@
package org.apache.spark.sql.execution.datasources.parquet;
import java.io.IOException;
+import java.math.BigInteger;
import java.nio.ByteBuffer;
import java.util.Arrays;
@@ -69,9 +70,6 @@ public class VectorizedDeltaBinaryPackedReader extends
VectorizedReaderBase {
private int remainingInBlock = 0; // values in current block still to be read
private int remainingInMiniBlock = 0; // values in current mini block still
to be read
private long[] unpackedValuesBuffer;
- // Scratch buffer for narrowing long -> int during bulk readIntegers.
- // Allocated eagerly in initFromPage, sized to miniBlockSizeInValues.
- private int[] intScratchBuffer;
private ByteBufferInputStream in;
@@ -97,7 +95,6 @@ public class VectorizedDeltaBinaryPackedReader extends
VectorizedReaderBase {
this.totalValueCount = BytesUtils.readUnsignedVarInt(in);
this.bitWidths = new int[miniBlockNumInABlock];
this.unpackedValuesBuffer = new long[miniBlockSizeInValues];
- this.intScratchBuffer = new int[miniBlockSizeInValues];
// read the first value
firstValue = BytesUtils.readZigZagVarLong(in);
}
@@ -143,32 +140,7 @@ public class VectorizedDeltaBinaryPackedReader extends
VectorizedReaderBase {
@Override
public void readIntegers(int total, WritableColumnVector c, int rowId) {
- readBulkIntegers(total, c, rowId);
- }
-
- @Override
- public void readIntegersAsLongs(int total, WritableColumnVector c, int
rowId) {
- // Delta decoder already works on long[]; skip the int narrowing and write
longs directly.
- readBulkLongs(total, c, rowId);
- }
-
- @Override
- public void readIntegersAsDoubles(int total, WritableColumnVector c, int
rowId) {
- checkReadBounds(total);
- int remaining = total;
- if (valuesRead == 0) {
- c.putDouble(rowId, (double) firstValue);
- lastValueRead = firstValue;
- rowId++;
- remaining--;
- }
- readBulkLoop(remaining, c, rowId,
- (col, r, buf, s, n) -> {
- for (int i = s; i < s + n; i++) {
- col.putDouble(r + i - s, (double) buf[i]);
- }
- });
- valuesRead += total;
+ readValues(total, c, rowId, (w, r, v) -> w.putInt(r, (int) v));
}
// Based on VectorizedPlainValuesReader.readIntegersWithRebase
@@ -198,13 +170,13 @@ public class VectorizedDeltaBinaryPackedReader extends
VectorizedReaderBase {
@Override
public void readUnsignedLongs(int total, WritableColumnVector c, int rowId) {
readValues(total, c, rowId, (w, r, v) -> {
- putUnsignedLongAsBigInteger(w, r, v);
+ w.putByteArray(r, new
BigInteger(Long.toUnsignedString(v)).toByteArray());
});
}
@Override
public void readLongs(int total, WritableColumnVector c, int rowId) {
- readBulkLongs(total, c, rowId);
+ readValues(total, c, rowId, WritableColumnVector::putLong);
}
@Override
@@ -243,111 +215,6 @@ public class VectorizedDeltaBinaryPackedReader extends
VectorizedReaderBase {
skipValues(total);
}
- // ---- Bulk read helpers for readIntegers / readLongs
----------------------------
- //
- // The generic readValues() path dispatches a lambda per value. For the two
most
- // common callers (readIntegers, readLongs) we can do much better: compute a
prefix
- // sum over the unpacked deltas in-place, then bulk-copy the result into the
column
- // vector with putInts / putLongs (backed by System.arraycopy on-heap).
-
- /**
- * Callback for writing a chunk of prefix-summed absolute values from
- * {@code unpackedValuesBuffer} into a column vector. Called once per
mini-block
- * (not per value), so lambda overhead is negligible.
- */
- @FunctionalInterface
- private interface BulkWriter {
- void write(WritableColumnVector c, int rowId, long[] values, int start,
int count);
- }
-
- /** Narrows long[] -> int[] scratch and bulk-writes via putInts. */
- private void bulkWriteInts(WritableColumnVector c, int rowId,
- long[] buf, int start, int count) {
- for (int i = start; i < start + count; i++) {
- intScratchBuffer[i] = (int) buf[i];
- }
- c.putInts(rowId, count, intScratchBuffer, start);
- }
-
- private void readBulkIntegers(int total, WritableColumnVector c, int rowId) {
- checkReadBounds(total);
- int remaining = total;
- if (valuesRead == 0) {
- c.putInt(rowId, (int) firstValue);
- lastValueRead = firstValue;
- rowId++;
- remaining--;
- }
- readBulkLoop(remaining, c, rowId, this::bulkWriteInts);
- valuesRead += total;
- }
-
- private void readBulkLongs(int total, WritableColumnVector c, int rowId) {
- checkReadBounds(total);
- int remaining = total;
- if (valuesRead == 0) {
- c.putLong(rowId, firstValue);
- lastValueRead = firstValue;
- rowId++;
- remaining--;
- }
- readBulkLoop(remaining, c, rowId,
- (col, r, buf, s, n) -> col.putLongs(r, n, buf, s));
- valuesRead += total;
- }
-
- private void checkReadBounds(int total) {
- if (valuesRead + total > totalValueCount) {
- throw new ParquetDecodingException(
- "No more values to read. Total values read: " + valuesRead + ",
total count: "
- + totalValueCount + ", trying to read " + total + " more.");
- }
- }
-
- /** Mini-block iteration loop shared by readBulkIntegers and readBulkLongs.
*/
- private void readBulkLoop(int remaining, WritableColumnVector c, int rowId,
- BulkWriter writer) {
- while (remaining > 0) {
- int n;
- try {
- n = loadMiniBlockBulk(remaining, c, rowId, writer);
- } catch (IOException e) {
- throw new ParquetDecodingException("Error reading mini block.", e);
- }
- rowId += n;
- remaining -= n;
- }
- }
-
- /**
- * Loads the next mini-block (if needed), prefix-sums the deltas in-place,
and
- * delegates the type-specific column write to {@code writer}.
- */
- private int loadMiniBlockBulk(int remaining, WritableColumnVector c, int
rowId,
- BulkWriter writer) throws IOException {
- if (remainingInBlock == 0) readBlockHeader();
- if (remainingInMiniBlock == 0) unpackMiniBlock();
-
- int start = miniBlockSizeInValues - remainingInMiniBlock;
- int count = Math.min(remaining, remainingInMiniBlock);
-
- // Prefix-sum: convert raw deltas -> absolute values in-place.
- long running = lastValueRead;
- long minDelta = minDeltaInCurrentBlock;
- long[] buf = unpackedValuesBuffer;
- for (int i = start; i < start + count; i++) {
- running += minDelta + buf[i];
- buf[i] = running;
- }
- lastValueRead = running;
-
- writer.write(c, rowId, buf, start, count);
-
- remainingInBlock -= count;
- remainingInMiniBlock -= count;
- return count;
- }
-
private void readValues(int total, WritableColumnVector c, int rowId,
IntegerOutputWriter outputWriter) {
if (valuesRead + total > totalValueCount) {
@@ -373,7 +240,7 @@ public class VectorizedDeltaBinaryPackedReader extends
VectorizedReaderBase {
rowId += n;
remaining -= n;
}
- valuesRead += total;
+ valuesRead = total - remaining;
}
@@ -461,12 +328,4 @@ public class VectorizedDeltaBinaryPackedReader extends
VectorizedReaderBase {
readValues(total, null, -1, (w, r, v) -> {});
}
- // Reusable buffer for unsigned long -> BigInteger encoding (9 bytes: sign +
8 value bytes).
- private final byte[] unsignedLongScratch = new byte[9];
-
- private void putUnsignedLongAsBigInteger(WritableColumnVector c, int rowId,
long v) {
- int start = encodeUnsignedLongBigEndian(v, unsignedLongScratch);
- c.putByteArray(rowId, unsignedLongScratch, start, 9 - start);
- }
-
}
diff --git
a/sql/core/src/main/java/org/apache/spark/sql/execution/datasources/parquet/VectorizedReaderBase.java
b/sql/core/src/main/java/org/apache/spark/sql/execution/datasources/parquet/VectorizedReaderBase.java
index f5ab1a68bea6..77bb9340e526 100644
---
a/sql/core/src/main/java/org/apache/spark/sql/execution/datasources/parquet/VectorizedReaderBase.java
+++
b/sql/core/src/main/java/org/apache/spark/sql/execution/datasources/parquet/VectorizedReaderBase.java
@@ -27,44 +27,6 @@ import
org.apache.spark.sql.execution.vectorized.WritableColumnVector;
*/
public class VectorizedReaderBase extends ValuesReader implements
VectorizedValuesReader {
- /**
- * Encodes an unsigned long as a minimal big-endian two's-complement byte
array
- * compatible with {@link java.math.BigInteger} encoding, written into
- * {@code scratch[start .. 8]} (length = 9 - start). {@code scratch} must
have length >= 9.
- *
- * <p>This avoids the per-value overhead of
- * {@code new BigInteger(Long.toUnsignedString(v)).toByteArray()} which
allocates a
- * String, a BigInteger, and a byte[] on every call.
- */
- static int encodeUnsignedLongBigEndian(long v, byte[] scratch) {
- // Minimal BigInteger-compatible length is bitLength/8 + 1, so the
- // encoding occupies scratch[start .. 8]; the loop runs once past the
- // significant bytes, which writes the 0x00 sign byte when one is needed.
- int start = 8 - (64 - Long.numberOfLeadingZeros(v)) / 8;
- long x = v;
- for (int i = 8; i >= start; i--) {
- scratch[i] = (byte) x;
- x >>>= 8;
- }
- return start;
- }
-
- /**
- * Convenience: encodes an unsigned long and returns a new byte[] with the
minimal
- * BigInteger-compatible encoding. Use {@link
#encodeUnsignedLongBigEndian(long, byte[])}
- * with a reusable buffer in hot paths to avoid allocation.
- */
- static byte[] unsignedLongToBytesBigEndian(long v) {
- int len = (64 - Long.numberOfLeadingZeros(v)) / 8 + 1;
- byte[] out = new byte[len];
- long x = v;
- for (int i = len - 1; i >= 0 && x != 0; i--) {
- out[i] = (byte) x;
- x >>>= 8;
- }
- return out;
- }
-
@Override
public void skip() {
throw SparkUnsupportedOperationException.apply();
diff --git
a/sql/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/VectorizedDeltaReaderBenchmark.scala
b/sql/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/VectorizedDeltaReaderBenchmark.scala
index b97faeaf57b6..40e08d9870c7 100644
---
a/sql/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/VectorizedDeltaReaderBenchmark.scala
+++
b/sql/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/VectorizedDeltaReaderBenchmark.scala
@@ -29,7 +29,7 @@ import org.apache.parquet.io.api.Binary
import org.apache.spark.benchmark.{Benchmark, BenchmarkBase}
import org.apache.spark.sql.execution.vectorized.OnHeapColumnVector
-import org.apache.spark.sql.types.{BinaryType, ByteType, DecimalType,
DoubleType, IntegerType, LongType, ShortType}
+import org.apache.spark.sql.types.{BinaryType, ByteType, DecimalType,
IntegerType, LongType, ShortType}
/**
* Low-level benchmark for the three Parquet delta-encoding decoders:
@@ -299,7 +299,6 @@ object VectorizedDeltaReaderBenchmark extends BenchmarkBase
{
val byteVec = new OnHeapColumnVector(NUM_ROWS, ByteType)
val shortVec = new OnHeapColumnVector(NUM_ROWS, ShortType)
val longVec = new OnHeapColumnVector(NUM_ROWS, LongType)
- val doubleVec = new OnHeapColumnVector(NUM_ROWS, DoubleType)
val unsignedLongVec = new OnHeapColumnVector(NUM_ROWS, DecimalType(20, 0))
def newIntReader(): VectorizedDeltaBinaryPackedReader = {
@@ -321,14 +320,7 @@ object VectorizedDeltaReaderBenchmark extends
BenchmarkBase {
benchmark.addCase("readUnsignedIntegers (INT32 -> Long)") { _ =>
newIntReader().readUnsignedIntegers(NUM_ROWS, longVec, 0)
}
- benchmark.addCase("readIntegersAsLongs (INT32 -> Long)") { _ =>
- newIntReader().readIntegersAsLongs(NUM_ROWS, longVec, 0)
- }
- benchmark.addCase("readIntegersAsDoubles (INT32 -> Double)") { _ =>
- newIntReader().readIntegersAsDoubles(NUM_ROWS, doubleVec, 0)
- }
benchmark.addCase("readUnsignedLongs (INT64 -> Decimal(20,0))") { _ =>
- unsignedLongVec.reset()
newLongReader().readUnsignedLongs(NUM_ROWS, unsignedLongVec, 0)
}
benchmark.addCase("skipBytes") { _ => newIntReader().skipBytes(NUM_ROWS) }
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]