alamb commented on code in PR #195: URL: https://github.com/apache/parquet-site/pull/195#discussion_r3795978722
########## content/en/blog/features/alp_encoding.md: ########## @@ -0,0 +1,363 @@ +--- +title: "ALP lightweight floating-point encoding in Apache Parquet" +date: 2026-08-14 +description: "Fast, random access, GPU and SIMD-friendly compression and decompression; similar in size to ZSTD" +author: "[Kosta Tarasov](https://github.com/sdf-jkl), [Andrew Lamb](https://github.com/alamb)" +categories: ["features"] +--- + +Apache Parquet adopts ALP (Adaptive Lossless floating-Point) -- a new lightweight floating-point encoding that shows similar compression ratio to heavyweight compressors like zstd and **much** faster decompression speed + "random access" support. + +"Random access" is a key feature of ALP -- it allows retrieving a single value without decoding the entire page. This property is becoming increasingly important for workloads such as point lookups with text and vector indexes. + +---- + +ALP was developed by the [Database Architectures Group at CWI](https://www.cwi.nl/en/research/database-architectures/) and uses smart tricks to represent floating-point data as integers. + +ALP shines at data that was originally decimal and stored as FLOAT/DOUBLE: +- Monetary values (exchange rates, public funds, stocks, prices, etc.) +- Geographic coordinates (longitude/latitude) +- Scientific measures (temperature, pressure, speed, degrees, etc.) +- Timestamps stored as floating-point + +## Why ALP? + +Encoding floating point data is a complicated engineering problem. Prior to ALP the only FLOAT/DOUBLE encoding in Parquet (other than Plain) was [Byte Stream Split](https://parquet.apache.org/docs/file-format/data-pages/encodings/#BYTESTREAMSPLIT). Byte Stream Split does not reduce the size of data but *can* make the compression ratio and speed better when a heavyweight compressor is used afterwards. + +Using heavyweight compression, however, introduces two problems: +- Slow decompression speed +- Requires decoding the entire page to retrieve a single value (the "random access" problem) + +ALP succeeds at solving both of these problems without losing compression ratio. Review Comment: ```suggestion ALP is designed to solve both of these problems for common data patterns, while achieving a similar compression ratio. ``` ########## content/en/blog/features/alp_encoding.md: ########## @@ -0,0 +1,363 @@ +--- +title: "ALP lightweight floating-point encoding in Apache Parquet" +date: 2026-08-14 +description: "Fast, random access, GPU and SIMD-friendly compression and decompression; similar in size to ZSTD" +author: "[Kosta Tarasov](https://github.com/sdf-jkl), [Andrew Lamb](https://github.com/alamb)" Review Comment: ```suggestion author: "[Kosta Tarasov](https://github.com/sdf-jkl), [Andrew Lamb](https://github.com/alamb), [Prateek Gaur](https://github.com/prtkgaur)" ``` ########## content/en/blog/features/alp_encoding.md: ########## @@ -0,0 +1,363 @@ +--- +title: "ALP lightweight floating-point encoding in Apache Parquet" +date: 2026-08-14 +description: "Fast, random access, GPU and SIMD-friendly compression and decompression; similar in size to ZSTD" +author: "[Kosta Tarasov](https://github.com/sdf-jkl), [Andrew Lamb](https://github.com/alamb)" +categories: ["features"] +--- + +Apache Parquet adopts ALP (Adaptive Lossless floating-Point) -- a new lightweight floating-point encoding that shows similar compression ratio to heavyweight compressors like zstd and **much** faster decompression speed + "random access" support. + +"Random access" is a key feature of ALP -- it allows retrieving a single value without decoding the entire page. This property is becoming increasingly important for workloads such as point lookups with text and vector indexes. + +---- + +ALP was developed by the [Database Architectures Group at CWI](https://www.cwi.nl/en/research/database-architectures/) and uses smart tricks to represent floating-point data as integers. + +ALP shines at data that was originally decimal and stored as FLOAT/DOUBLE: +- Monetary values (exchange rates, public funds, stocks, prices, etc.) +- Geographic coordinates (longitude/latitude) +- Scientific measures (temperature, pressure, speed, degrees, etc.) +- Timestamps stored as floating-point + +## Why ALP? + +Encoding floating point data is a complicated engineering problem. Prior to ALP the only FLOAT/DOUBLE encoding in Parquet (other than Plain) was [Byte Stream Split](https://parquet.apache.org/docs/file-format/data-pages/encodings/#BYTESTREAMSPLIT). Byte Stream Split does not reduce the size of data but *can* make the compression ratio and speed better when a heavyweight compressor is used afterwards. Review Comment: It would be good to say why "it is a complicated engineering problem" -- for example that floating point data can vary widely between datasets and can have wide ranges of distributions. You could then also make the point that many datasets don't actually use the full range of floating point numbers and that ALP exploits that observation ########## content/en/blog/features/alp_encoding.md: ########## @@ -0,0 +1,363 @@ +--- +title: "ALP lightweight floating-point encoding in Apache Parquet" +date: 2026-08-14 +description: "Fast, random access, GPU and SIMD-friendly compression and decompression; similar in size to ZSTD" +author: "[Kosta Tarasov](https://github.com/sdf-jkl), [Andrew Lamb](https://github.com/alamb)" +categories: ["features"] +--- + +Apache Parquet adopts ALP (Adaptive Lossless floating-Point) -- a new lightweight floating-point encoding that shows similar compression ratio to heavyweight compressors like zstd and **much** faster decompression speed + "random access" support. + +"Random access" is a key feature of ALP -- it allows retrieving a single value without decoding the entire page. This property is becoming increasingly important for workloads such as point lookups with text and vector indexes. Review Comment: I think we should also mention the friendliness to modern hardware (SIMD and GPU as well). Maybe something like ```suggestion Apache Parquet has added ALP (Adaptive Lossless floating-Point) -- a new lightweight floating-point encoding with similar compression to heavyweight compressors like zstd and **much** faster decompression speed, supports random access, and is SIMD and GPU friendly. ``` Then we can fill out the claims in the sections of the article ########## content/en/blog/features/alp_encoding.md: ########## @@ -0,0 +1,363 @@ +--- +title: "ALP lightweight floating-point encoding in Apache Parquet" +date: 2026-08-14 +description: "Fast, random access, GPU and SIMD-friendly compression and decompression; similar in size to ZSTD" +author: "[Kosta Tarasov](https://github.com/sdf-jkl), [Andrew Lamb](https://github.com/alamb)" +categories: ["features"] +--- + +Apache Parquet adopts ALP (Adaptive Lossless floating-Point) -- a new lightweight floating-point encoding that shows similar compression ratio to heavyweight compressors like zstd and **much** faster decompression speed + "random access" support. + +"Random access" is a key feature of ALP -- it allows retrieving a single value without decoding the entire page. This property is becoming increasingly important for workloads such as point lookups with text and vector indexes. + +---- + +ALP was developed by the [Database Architectures Group at CWI](https://www.cwi.nl/en/research/database-architectures/) and uses smart tricks to represent floating-point data as integers. + +ALP shines at data that was originally decimal and stored as FLOAT/DOUBLE: +- Monetary values (exchange rates, public funds, stocks, prices, etc.) +- Geographic coordinates (longitude/latitude) +- Scientific measures (temperature, pressure, speed, degrees, etc.) +- Timestamps stored as floating-point + +## Why ALP? + +Encoding floating point data is a complicated engineering problem. Prior to ALP the only FLOAT/DOUBLE encoding in Parquet (other than Plain) was [Byte Stream Split](https://parquet.apache.org/docs/file-format/data-pages/encodings/#BYTESTREAMSPLIT). Byte Stream Split does not reduce the size of data but *can* make the compression ratio and speed better when a heavyweight compressor is used afterwards. + +Using heavyweight compression, however, introduces two problems: +- Slow decompression speed +- Requires decoding the entire page to retrieve a single value (the "random access" problem) + +ALP succeeds at solving both of these problems without losing compression ratio. + +### Benchmark + +To demonstrate ALP's performance we used the same datasets used in the paper. + +- The first 13 are time series data, mostly scientific measurements +- 17 datasets are more representative of +doubles stored in classical database workloads, mostly monetary data + +<details><summary>Full list of datasets </summary> + +| Name | Semantics | Source | N° of Values | +|---|---|---|---:| +| **Time series** | | | | +| Air-Pressure | Barometric Pressure (kPa) | NEON | 137,721,453 | +| Basel-temp | Temperature (C°) | meteoblue | 123,480 | +| Basel-wind | Wind Speed (Km/h) | meteoblue | 123,480 | +| Bird-migration | Coordinates (lat, lon) | InfluxDB | 17,964 | +| Bitcoin-price | Exchange Rate (BTC-USD) | InfluxDB | 2,686 | +| City-Temp | Temperature (F°) | Udayton | 2,905,887 | +| Dew-Point-Temp | Temperature (C°) | NEON | 5,413,914 | +| IR-bio-temp | Temperature (C°) | NEON | 380,817,839 | +| PM10-dust | Dust content in air (mg/m3) | NEON | 221,568 | +| Stocks-DE | Monetary (Stocks) | INFORE | 43,565,658 | +| Stocks-UK | Monetary (Stocks) | INFORE | 59,305,326 | +| Stocks-USA | Monetary (Stocks) | INFORE | 282,076,179 | +| Wind-dir | Angle Degree (0°-360°) | NEON | 198,898,762 | +| **Non Time series** | | | | +| Arade/4 | Energy | PBI Bench. | 9,888,775 | +| Blockchain-tr | Monetary (BTC) | Blockchain | 231,031 | +| CMS/1 | Monetary Avg. (USD) | PBI Bench. | 18,575,752 | +| CMS/25 | Monetary Std. Dev. (USD) | PBI Bench. | 18,575,752 | +| CMS/9 | Discrete Count | PBI Bench. | 18,575,752 | +| Food-prices | Monetary (USD) | WFP | 2,050,638 | +| Gov/10 | Monetary (USD) | PBI Bench. | 141,123,827 | +| Gov/26 | Monetary (USD) | PBI Bench. | 141,123,827 | +| Gov/30 | Monetary (USD) | PBI Bench. | 141,123,827 | +| Gov/31 | Monetary (USD) | PBI Bench. | 141,123,827 | +| Gov/40 | Monetary (USD) | PBI Bench. | 141,123,827 | +| Medicare/1 | Monetary Avg. (USD) | PBI Bench. | 9,287,876 | +| Medicare/9 | Discrete Count | PBI Bench. | 9,287,876 | +| NYC/29 | Coordinates (lon) | PBI Bench. | 17,446,346 | +| POI-lat | Coordinates (lat, in radians) | Kaggle | 424,205 | +| POI-lon | Coordinates (lon, in radians) | Kaggle | 424,205 | +| SD-bench | Storage Capacity (GB) | Kaggle | 8,927 | + +</details> + +<br> + +We compare compression ratio and [de]compression speed between: +- Plain +- Plain + ZSTD +- Byte Stream Split + ZSTD +- ALP + +### Benchmark results + +| Encoding scheme | Compression (GB/s) | Decompression (GB/s) | Compressed size (bits/value) | +|---|---:|---:|---:| +| **PLAIN** | **65.547** | **76.644** | **64.01** | +| **PLAIN + ZSTD** | **1.401** | **3.236** | **22.75** | +| **BYTE_STREAM_SPLIT + ZSTD** | **1.786** | **5.132** | **32.76** | +| **ALP** | **1.273** | **33.805** | **24.27** | + +<details><summary>Full benchmark results </summary> + +| Dataset | Parquet choice | Compression (GB/s) | Decompression (GB/s) | Compressed size (bits/value) | +|---|---|---:|---:|---:| +| arade4 | PLAIN | 63.775 | 68.205 | 64.01 | +| arade4 | PLAIN + ZSTD | 0.574 | 1.499 | 37.39 | +| arade4 | BYTE_STREAM_SPLIT + ZSTD | 1.875 | 4.980 | 54.58 | +| arade4 | ALP | 1.698 | 31.860 | 24.99 | +| basel_temp_f | PLAIN | 33.559 | 57.828 | 64.01 | +| basel_temp_f | PLAIN + ZSTD | 0.458 | 1.656 | 23.07 | +| basel_temp_f | BYTE_STREAM_SPLIT + ZSTD | 1.181 | 2.080 | 54.59 | +| basel_temp_f | ALP | 0.534 | 28.058 | 29.23 | +| basel_wind_f | PLAIN | 52.641 | 76.402 | 64.01 | +| basel_wind_f | PLAIN + ZSTD | 0.591 | 1.733 | 18.53 | +| basel_wind_f | BYTE_STREAM_SPLIT + ZSTD | 1.405 | 2.191 | 54.12 | +| basel_wind_f | ALP | 0.576 | 29.778 | 29.87 | +| bird_migration_f | PLAIN | 65.238 | 93.070 | 64.01 | +| bird_migration_f | PLAIN + ZSTD | 0.420 | 1.778 | 23.49 | +| bird_migration_f | BYTE_STREAM_SPLIT + ZSTD | 1.210 | 10.407 | 45.82 | +| bird_migration_f | ALP | 0.164 | 27.212 | 20.24 | +| bitcoin_f | PLAIN | 91.371 | 222.346 | 64.07 | +| bitcoin_f | PLAIN + ZSTD | 0.585 | 1.660 | 50.01 | +| bitcoin_f | BYTE_STREAM_SPLIT + ZSTD | 1.345 | 19.512 | 48.79 | +| bitcoin_f | ALP | 0.047 | 30.608 | 27.18 | +| bitcoin_transactions_f | PLAIN | 61.862 | 76.608 | 64.01 | +| bitcoin_transactions_f | PLAIN + ZSTD | 1.081 | 1.985 | 47.96 | +| bitcoin_transactions_f | BYTE_STREAM_SPLIT + ZSTD | 1.412 | 2.580 | 56.65 | +| bitcoin_transactions_f | ALP | 0.572 | 21.192 | 41.27 | +| city_temperature_f | PLAIN | 74.404 | 75.291 | 64.01 | +| city_temperature_f | PLAIN + ZSTD | 0.561 | 1.368 | 17.67 | +| city_temperature_f | BYTE_STREAM_SPLIT + ZSTD | 0.962 | 3.569 | 16.64 | +| city_temperature_f | ALP | 1.972 | 37.725 | 10.80 | +| cms1 | PLAIN | 64.257 | 62.655 | 64.01 | +| cms1 | PLAIN + ZSTD | 0.627 | 1.600 | 26.84 | +| cms1 | BYTE_STREAM_SPLIT + ZSTD | 0.670 | 1.651 | 38.64 | +| cms1 | ALP | 1.061 | 18.514 | 35.19 | +| cms25 | PLAIN | 70.317 | 71.847 | 64.01 | +| cms25 | PLAIN + ZSTD | 0.798 | 1.829 | 58.11 | +| cms25 | BYTE_STREAM_SPLIT + ZSTD | 1.287 | 4.345 | 56.72 | +| cms25 | ALP | 1.516 | 21.901 | 41.17 | +| cms9 | PLAIN | 65.334 | 67.735 | 64.01 | +| cms9 | PLAIN + ZSTD | 0.668 | 1.436 | 11.71 | +| cms9 | BYTE_STREAM_SPLIT + ZSTD | 2.151 | 5.502 | 10.07 | +| cms9 | ALP | 1.932 | 34.393 | 12.16 | +| food_prices | PLAIN | 71.786 | 75.631 | 64.01 | +| food_prices | PLAIN + ZSTD | 0.574 | 1.356 | 18.13 | +| food_prices | BYTE_STREAM_SPLIT + ZSTD | 0.744 | 1.865 | 25.47 | +| food_prices | ALP | 0.887 | 20.747 | 23.20 | +| gov10 | PLAIN | 67.983 | 70.573 | 64.01 | +| gov10 | PLAIN + ZSTD | 0.486 | 1.259 | 29.12 | +| gov10 | BYTE_STREAM_SPLIT + ZSTD | 0.648 | 1.740 | 37.31 | +| gov10 | ALP | 1.119 | 24.621 | 29.88 | +| gov26 | PLAIN | 66.105 | 67.432 | 64.01 | +| gov26 | PLAIN + ZSTD | 10.325 | 23.010 | 0.20 | +| gov26 | BYTE_STREAM_SPLIT + ZSTD | 8.112 | 18.208 | 0.24 | +| gov26 | ALP | 1.876 | 84.789 | 1.40 | +| gov30 | PLAIN | 61.089 | 64.308 | 64.01 | +| gov30 | PLAIN + ZSTD | 2.038 | 5.186 | 4.52 | +| gov30 | BYTE_STREAM_SPLIT + ZSTD | 1.695 | 4.155 | 6.14 | +| gov30 | ALP | 1.020 | 33.276 | 17.88 | +| gov31 | PLAIN | 70.238 | 71.923 | 64.01 | +| gov31 | PLAIN + ZSTD | 3.821 | 8.994 | 1.65 | +| gov31 | BYTE_STREAM_SPLIT + ZSTD | 3.780 | 9.643 | 2.47 | +| gov31 | ALP | 1.659 | 50.153 | 6.77 | +| gov40 | PLAIN | 74.751 | 75.933 | 64.01 | +| gov40 | PLAIN + ZSTD | 9.232 | 17.740 | 0.43 | +| gov40 | BYTE_STREAM_SPLIT + ZSTD | 6.477 | 13.890 | 0.62 | +| gov40 | ALP | 1.879 | 77.866 | 2.59 | +| medicare1 | PLAIN | 73.791 | 65.523 | 64.01 | +| medicare1 | PLAIN + ZSTD | 0.552 | 1.508 | 31.68 | +| medicare1 | BYTE_STREAM_SPLIT + ZSTD | 0.800 | 2.166 | 45.27 | +| medicare1 | ALP | 0.958 | 19.660 | 40.46 | +| medicare9 | PLAIN | 73.908 | 75.228 | 64.01 | +| medicare9 | PLAIN + ZSTD | 0.706 | 1.471 | 11.86 | +| medicare9 | BYTE_STREAM_SPLIT + ZSTD | 2.126 | 5.717 | 10.19 | +| medicare9 | ALP | 1.938 | 36.311 | 12.82 | +| neon_air_pressure | PLAIN | 70.685 | 73.563 | 64.01 | +| neon_air_pressure | PLAIN + ZSTD | 0.789 | 2.051 | 11.85 | +| neon_air_pressure | BYTE_STREAM_SPLIT + ZSTD | 0.782 | 2.268 | 28.51 | +| neon_air_pressure | ALP | 1.876 | 36.770 | 16.48 | +| neon_bio_temp_c | PLAIN | 63.818 | 69.314 | 64.01 | +| neon_bio_temp_c | PLAIN + ZSTD | 0.522 | 1.513 | 16.84 | +| neon_bio_temp_c | BYTE_STREAM_SPLIT + ZSTD | 1.240 | 2.885 | 35.40 | +| neon_bio_temp_c | ALP | 1.941 | 35.578 | 10.81 | +| neon_dew_point_temp | PLAIN | 72.097 | 73.614 | 64.01 | +| neon_dew_point_temp | PLAIN + ZSTD | 0.465 | 1.638 | 23.73 | +| neon_dew_point_temp | BYTE_STREAM_SPLIT + ZSTD | 1.503 | 2.370 | 48.00 | +| neon_dew_point_temp | ALP | 1.931 | 32.863 | 13.63 | +| neon_pm10_dust | PLAIN | 51.533 | 70.722 | 64.01 | +| neon_pm10_dust | PLAIN + ZSTD | 0.848 | 1.689 | 7.79 | +| neon_pm10_dust | BYTE_STREAM_SPLIT + ZSTD | 0.634 | 1.682 | 22.21 | +| neon_pm10_dust | ALP | 0.927 | 38.427 | 8.41 | +| neon_wind_dir | PLAIN | 54.631 | 60.583 | 64.01 | +| neon_wind_dir | PLAIN + ZSTD | 0.432 | 1.312 | 24.41 | +| neon_wind_dir | BYTE_STREAM_SPLIT + ZSTD | 1.387 | 3.518 | 42.31 | +| neon_wind_dir | ALP | 1.883 | 47.114 | 15.94 | +| nyc29 | PLAIN | 71.342 | 71.984 | 64.01 | +| nyc29 | PLAIN + ZSTD | 0.611 | 1.539 | 24.67 | +| nyc29 | BYTE_STREAM_SPLIT + ZSTD | 0.939 | 3.768 | 36.91 | +| nyc29 | ALP | 1.679 | 24.137 | 40.43 | +| poi_lat | PLAIN | 58.440 | 50.294 | 64.01 | +| poi_lat | PLAIN + ZSTD | 0.635 | 1.793 | 57.78 | +| poi_lat | BYTE_STREAM_SPLIT + ZSTD | 2.711 | 5.929 | 55.30 | +| poi_lat | ALP | 1.052 | 11.874 | 88.19 | +| poi_lon | PLAIN | 61.546 | 73.497 | 64.01 | +| poi_lon | PLAIN + ZSTD | 0.850 | 1.945 | 60.44 | +| poi_lon | BYTE_STREAM_SPLIT + ZSTD | 2.467 | 5.826 | 57.24 | +| poi_lon | ALP | 1.180 | 14.614 | 79.12 | +| ssd_hdd_benchmarks_f | PLAIN | 66.698 | 112.905 | 64.02 | +| ssd_hdd_benchmarks_f | PLAIN + ZSTD | 0.813 | 1.802 | 12.98 | +| ssd_hdd_benchmarks_f | BYTE_STREAM_SPLIT + ZSTD | 1.265 | 2.850 | 17.42 | +| ssd_hdd_benchmarks_f | ALP | 0.114 | 35.975 | 16.04 | +| stocks_de | PLAIN | 68.397 | 71.924 | 64.01 | +| stocks_de | PLAIN + ZSTD | 0.664 | 1.689 | 10.07 | +| stocks_de | BYTE_STREAM_SPLIT + ZSTD | 0.881 | 2.278 | 33.46 | +| stocks_de | ALP | 1.224 | 35.921 | 11.20 | +| stocks_uk | PLAIN | 60.600 | 64.531 | 64.01 | +| stocks_uk | PLAIN + ZSTD | 0.608 | 1.413 | 11.29 | +| stocks_uk | BYTE_STREAM_SPLIT + ZSTD | 1.180 | 4.006 | 14.89 | +| stocks_uk | ALP | 0.948 | 32.869 | 12.75 | +| stocks_usa_c | PLAIN | 64.214 | 67.851 | 64.01 | +| stocks_usa_c | PLAIN + ZSTD | 0.692 | 1.634 | 8.24 | +| stocks_usa_c | BYTE_STREAM_SPLIT + ZSTD | 0.712 | 2.390 | 26.89 | +| stocks_usa_c | ALP | 2.028 | 39.329 | 7.95 | +| **ALL AVG.** | **PLAIN** | **65.547** | **76.644** | **64.01** | +| **ALL AVG.** | **PLAIN + ZSTD** | **1.401** | **3.236** | **22.75** | +| **ALL AVG.** | **BYTE_STREAM_SPLIT + ZSTD** | **1.786** | **5.132** | **32.76** | +| **ALL AVG.** | **ALP** | **1.273** | **33.805** | **24.27** | + +</details> + +### Random access benchmark + +We also measured random access time for the encodings above. Review Comment: I will also try and make this into a chart ########## content/en/blog/features/alp_encoding.md: ########## @@ -0,0 +1,363 @@ +--- +title: "ALP lightweight floating-point encoding in Apache Parquet" +date: 2026-08-14 +description: "Fast, random access, GPU and SIMD-friendly compression and decompression; similar in size to ZSTD" +author: "[Kosta Tarasov](https://github.com/sdf-jkl), [Andrew Lamb](https://github.com/alamb)" +categories: ["features"] +--- + +Apache Parquet adopts ALP (Adaptive Lossless floating-Point) -- a new lightweight floating-point encoding that shows similar compression ratio to heavyweight compressors like zstd and **much** faster decompression speed + "random access" support. + +"Random access" is a key feature of ALP -- it allows retrieving a single value without decoding the entire page. This property is becoming increasingly important for workloads such as point lookups with text and vector indexes. + +---- + +ALP was developed by the [Database Architectures Group at CWI](https://www.cwi.nl/en/research/database-architectures/) and uses smart tricks to represent floating-point data as integers. + +ALP shines at data that was originally decimal and stored as FLOAT/DOUBLE: Review Comment: Maybe also worth mentioning this double modeling is very common in real world workloads (for example, Numpy and pandas don't include a decimal type defauly -- e.g. https://numpy.org/devdocs/user/basics.types.html) ########## content/en/blog/features/alp_encoding.md: ########## @@ -0,0 +1,363 @@ +--- +title: "ALP lightweight floating-point encoding in Apache Parquet" +date: 2026-08-14 +description: "Fast, random access, GPU and SIMD-friendly compression and decompression; similar in size to ZSTD" +author: "[Kosta Tarasov](https://github.com/sdf-jkl), [Andrew Lamb](https://github.com/alamb)" +categories: ["features"] +--- + +Apache Parquet adopts ALP (Adaptive Lossless floating-Point) -- a new lightweight floating-point encoding that shows similar compression ratio to heavyweight compressors like zstd and **much** faster decompression speed + "random access" support. + +"Random access" is a key feature of ALP -- it allows retrieving a single value without decoding the entire page. This property is becoming increasingly important for workloads such as point lookups with text and vector indexes. + +---- + +ALP was developed by the [Database Architectures Group at CWI](https://www.cwi.nl/en/research/database-architectures/) and uses smart tricks to represent floating-point data as integers. + +ALP shines at data that was originally decimal and stored as FLOAT/DOUBLE: +- Monetary values (exchange rates, public funds, stocks, prices, etc.) +- Geographic coordinates (longitude/latitude) +- Scientific measures (temperature, pressure, speed, degrees, etc.) +- Timestamps stored as floating-point + +## Why ALP? + +Encoding floating point data is a complicated engineering problem. Prior to ALP the only FLOAT/DOUBLE encoding in Parquet (other than Plain) was [Byte Stream Split](https://parquet.apache.org/docs/file-format/data-pages/encodings/#BYTESTREAMSPLIT). Byte Stream Split does not reduce the size of data but *can* make the compression ratio and speed better when a heavyweight compressor is used afterwards. + +Using heavyweight compression, however, introduces two problems: +- Slow decompression speed +- Requires decoding the entire page to retrieve a single value (the "random access" problem) + +ALP succeeds at solving both of these problems without losing compression ratio. + +### Benchmark + +To demonstrate ALP's performance we used the same datasets used in the paper. + +- The first 13 are time series data, mostly scientific measurements +- 17 datasets are more representative of +doubles stored in classical database workloads, mostly monetary data + +<details><summary>Full list of datasets </summary> Review Comment: I made some example summary diagrams for consideration: <img width="1080" height="920" alt="Image" src="https://github.com/user-attachments/assets/01a3250d-4bbc-4125-82eb-e558b7d519c1" /> <img width="1080" height="840" alt="Image" src="https://github.com/user-attachments/assets/d81a7926-855c-48ba-ab8c-e616c730367e" /> <img width="1080" height="840" alt="Image" src="https://github.com/user-attachments/assets/50f2fcc7-3c32-4879-bcba-fdf413769da6" /> ########## content/en/blog/features/alp_encoding.md: ########## @@ -0,0 +1,363 @@ +--- +title: "ALP lightweight floating-point encoding in Apache Parquet" +date: 2026-08-14 +description: "Fast, random access, GPU and SIMD-friendly compression and decompression; similar in size to ZSTD" +author: "[Kosta Tarasov](https://github.com/sdf-jkl), [Andrew Lamb](https://github.com/alamb)" +categories: ["features"] +--- + +Apache Parquet adopts ALP (Adaptive Lossless floating-Point) -- a new lightweight floating-point encoding that shows similar compression ratio to heavyweight compressors like zstd and **much** faster decompression speed + "random access" support. + +"Random access" is a key feature of ALP -- it allows retrieving a single value without decoding the entire page. This property is becoming increasingly important for workloads such as point lookups with text and vector indexes. + +---- + +ALP was developed by the [Database Architectures Group at CWI](https://www.cwi.nl/en/research/database-architectures/) and uses smart tricks to represent floating-point data as integers. + +ALP shines at data that was originally decimal and stored as FLOAT/DOUBLE: +- Monetary values (exchange rates, public funds, stocks, prices, etc.) +- Geographic coordinates (longitude/latitude) +- Scientific measures (temperature, pressure, speed, degrees, etc.) +- Timestamps stored as floating-point + +## Why ALP? + +Encoding floating point data is a complicated engineering problem. Prior to ALP the only FLOAT/DOUBLE encoding in Parquet (other than Plain) was [Byte Stream Split](https://parquet.apache.org/docs/file-format/data-pages/encodings/#BYTESTREAMSPLIT). Byte Stream Split does not reduce the size of data but *can* make the compression ratio and speed better when a heavyweight compressor is used afterwards. + +Using heavyweight compression, however, introduces two problems: +- Slow decompression speed +- Requires decoding the entire page to retrieve a single value (the "random access" problem) + +ALP succeeds at solving both of these problems without losing compression ratio. + +### Benchmark + +To demonstrate ALP's performance we used the same datasets used in the paper. + +- The first 13 are time series data, mostly scientific measurements +- 17 datasets are more representative of +doubles stored in classical database workloads, mostly monetary data + +<details><summary>Full list of datasets </summary> Review Comment: I feel like this detail on experimental setup and detailed results is obscuring the main narrative. I recommend we 1. Add a summary chart with results 1. move all these details to an Appendix at end of the blog 2. Make sure we link somewhere so that anyone who cares can reproduce these numbers In terms of reproducer, i recommend we create a repository with the benchmark runner script pulled otu (rather than a branch in arrow-rs) and we can link there. I can do this if it would help -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: [email protected] For queries about this service, please contact Infrastructure at: [email protected]
