apache / apache/parquet-java

Make DELTA_LENGTH_BYTE_ARRAY default encoding for binary values

未关闭
#3,083 0 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看
Type: enhancement
主要语言
Java
星标
3.1k
派生
1.6k
平均合并
3 天 12 小时
30 天内合并 PR
33

描述

### Describe the enhancement requested

The current default for V1 pages is PLAIN encoding. This encoding mixes string length with string data. This is inefficient for for skipping N values, as the encoding does not allow random access. It's also slow to decode as the interleaving of lengths with data does not allow efficient batched implementations and forces most implementations to make copies of the data to fit the usual representation of separate offsets and data for strings.

DELTA_LENGTH_BYTE_ARRAY has none of the above problems as it separates offsets and data. The parquet-format spec also seems to recommend this
https://github.com/apache/parquet-format/blob/c70281359087dfaee8bd43bed9748675f4aabe11/Encodings.md?plain=1#L299
```
### Delta-length byte array: (DELTA_LENGTH_BYTE_ARRAY = 6)

Supported Types: BYTE_ARRAY

This encoding is always preferred over PLAIN for byte array columns.
```

V2 pages use DELTA_BYTE_ARRAY as the default encoding, this is an improvement over PLAIN but adds complexity which makes it slower to decode than DELTA_LENGTH_BYTE_ARRAY with the potential benefit of lower storage requirements.

JMH benchmarks in Trino's parquet reader at `io.trino.parquet.reader.BenchmarkBinaryColumnReader` showed that DELTA_LENGTH_BYTE_ARRAY can be decoded at over 5X speed and DELTA_BYTE_ARRAY at over 2X the speed of decoding PLAIN encoding.
Given the above recommendation of parquet-format spec and significant performance difference, the reference implementation here should be updated to use DELTA_LENGTH_BYTE_ARRAY by default.

### Component(s)

Core

贡献指南

这个仓库没有索引到贡献指南

调研方向

issue 中没有指定源文件或测试。首先在 parquet-java 的 Core 实现中找到 V1 和 V2 的默认编码选择逻辑,然后检查现有的编码测试。当 BYTE_ARRAY 列默认使用 DELTA_LENGTH_BYTE_ARRAY,同时其他编码行为保持不变时,即表示完成。

由索引模型根据 Issue 内容生成。

评估

技术栈
java
领域
data-engineering
Issue 类型
功能
难度
4/5
预计耗时
3-5 天
活跃度
停滞
描述清晰度
基本清楚
新手友好度
48/100

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。