Parquet 实现状态
本页面总结了不同 Parquet 实现所支持的功能。
注意:此页面仍在完善中,欢迎大家帮助扩展其内容。
图例
每个单元格的值表示:
- ✅:支持
- ❌:不支持
- (R/W):仅部分支持读取/写入
- (空白):无数据
各种实现:
C++:parquet-cppJava:parquet-javaGo:parquet-goRust:parquet-rscuDF:cudf
物理数据类型支持情况
| 数据类型 | C++ | Java | Go | Rust | cuDF |
|---|---|---|---|---|---|
| BOOLEAN | ✅ | ✅ | ✅ | ||
| INT32 | ✅ | ✅ | ✅ | ||
| INT64 | ✅ | ✅ | ✅ | ||
| INT96 (1) | ✅ | ✅ | ✅ | ||
| FLOAT | ✅ | ✅ | ✅ | ||
| DOUBLE | ✅ | ✅ | ✅ | ||
| BYTE_ARRAY | ✅ | ✅ | ✅ | ||
| FIXED_LEN_BYTE_ARRAY | ✅ | ✅ | ✅ |
(1) 该类型已被弃用,但截至 2024 年仍然常见于现有 Parquet 文件中。
逻辑数据类型支持情况
| 数据类型 | C++ | Java | Go | Rust | cuDF |
|---|---|---|---|---|---|
| STRING | ✅ | ✅ | ✅ | ||
| ENUM | ❌ | ✅ | ❌ | ||
| UUID | ❌ | ✅ | ❌ | ||
| 8, 16, 32, 64 位有符号/无符号整数 | ✅ | ✅ | ✅ | ||
| DECIMAL (INT32) | ✅ | ✅ | ✅ | ||
| DECIMAL (INT64) | ✅ | ✅ | ✅ | ||
| DECIMAL (BYTE_ARRAY) | ✅ | ✅ | ✅ | ||
| DECIMAL (FIXED_LEN_BYTE_ARRAY) | ✅ | ✅ | ✅ | ||
| DATE | ✅ | ✅ | ✅ | ||
| TIME (INT32) | ✅ | ✅ | ✅ | ||
| TIME (INT64) | ✅ | ✅ | ✅ | ||
| TIMESTAMP (INT64) | ✅ | ✅ | ✅ | ||
| INTERVAL | ✅ | ✅(*) | ❌ | ||
| JSON | ✅ | ✅(*) | ❌ | ||
| BSON | ❌ | ✅(*) | ❌ | ||
| LIST | ✅ | ✅ | ✅ | ||
| MAP | ✅ | ✅ | ✅ | ||
| UNKNOWN (始终为空) | ✅ | ✅ | ✅ | ||
| FLOAT16 | ✅ | ✅(*) | ✅ |
(*) 仅支持其物理类型的注解。
编码方式支持情况
| 编码方式 | C++ | Java | Go | Rust | cuDF |
|---|---|---|---|---|---|
| PLAIN | ✅ | ✅ | ✅ | ||
| PLAIN_DICTIONARY | ✅ | ✅ | ✅ | ||
| RLE_DICTIONARY | ✅ | ✅ | ✅ | ||
| RLE | ✅ | ✅ | ✅ | ||
| BIT_PACKED (已弃用) | ✅ | ✅ | (R) | ||
| DELTA_BINARY_PACKED | ✅ | ✅ | ✅ | ||
| DELTA_LENGTH_BYTE_ARRAY | ✅ | ✅ | ✅ | ||
| DELTA_BYTE_ARRAY | ✅ | ✅ | ✅ | ||
| BYTE_STREAM_SPLIT | ✅ | ✅ | ✅ |
压缩方式支持情况
| 压缩方式 | C++ | Java | Go | Rust | cuDF |
|---|---|---|---|---|---|
| UNCOMPRESSED | ✅ | ✅ | ✅ | ||
| BROTLI | ✅ | ✅ | (R) | ||
| GZIP | ✅ | ✅ | (R) | ||
| LZ4 (已弃用) | ✅ | ❌ | ❌ | ||
| LZ4_RAW | ✅ | ✅ | ✅ | ||
| LZO | ❌ | ❌ | ❌ | ||
| SNAPPY | ✅ | ✅ | ✅ | ||
| ZSTD | ✅ | ✅ | ✅ |
其他格式级功能支持情况
| 功能 | C++ | Java | Go | Rust | cuDF |
|---|---|---|---|---|---|
| xxHash 布隆过滤器 | (R) | ✅ | (R) | ||
| 布隆过滤器长度 (1) | (R) | ✅ | (R) | ||
| 统计 min_value, max_value | ✅ | ✅ | ✅ | ||
| 页面索引 | ✅ | ✅ | ✅ | ||
| 页面 CRC32 校验 | ✅ | ✅ | ❌ | ||
| 模块化加密 | ✅ | ✅ | ❌ | ||
| 大小统计 (2) | ✅ | ✅ | ✅ |
(1) 见 parquet.thrift: ColumnMetaData->bloom_filter_length。
(2) 见 parquet.thrift: ColumnMetaData->size_statistics。
高级数据 API 对 Parquet 特性的支持
| 功能 | C++ | Java | Go | Rust | cuDF |
|---|---|---|---|---|---|
| 外部列数据 (1) | ✅ | ✅ | (W) | ||
| 行组 “排序列” 元数据 (2) | ✅ | ❌ | (W) | ||
| 通过统计信息进行行组剪枝 | ❌ | ✅ | ✅ | ||
| 通过布隆过滤器进行行组剪枝 | ❌ | ✅ | ✅ | ||
| 仅读取特定列 | ✅ | ✅ | ✅ | ||
| 通过统计信息进行页面剪枝 | ❌ | ✅ | ❌ |
(1) 见 parquet.thrift: ColumnChunk->file_path。
(2) 见 parquet.thrift: RowGroup->sorting_columns。