|
| 1 | +# 配置列的编码和压缩算法 |
| 2 | + |
| 3 | +Datalayers 支持为每个列指定适用的编码和压缩算法。 |
| 4 | + |
| 5 | +## SQL 语法 |
| 6 | + |
| 7 | +### 建表时指定编码和压缩 |
| 8 | + |
| 9 | +在建表时可以通过为每个列设置 `ENCODING` 来配置编码算法,以及设置 `COMPRESSION` 来配置压缩算法。示例如下: |
| 10 | + |
| 11 | +``` sql |
| 12 | +CREATE TABLE `sx1` |
| 13 | +( |
| 14 | + ts TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, |
| 15 | + sid INT32 ENCODING RLE COMPRESSION SNAPPY, |
| 16 | + value REAL, |
| 17 | + flag INT8, |
| 18 | + timestamp key (ts), |
| 19 | +) |
| 20 | +PARTITION BY HASH(sid) PARTITIONS 8 |
| 21 | +ENGINE=TimeSeries |
| 22 | +``` |
| 23 | + |
| 24 | +在这个例子中,我们给 `sid` 列设置了 `RLE` 编码与 `SNAPPY` 压缩算法。 |
| 25 | + |
| 26 | +#### 注意事项 |
| 27 | + |
| 28 | +- Datalayers 不区分 `ENCODING`、`COMPRESSION` 关键词的大小写。 |
| 29 | +- Datalayers 不区分编码和压缩算法的大小写。例如 `RLE`、`rLE`、`rle` 都视为合法的输入。 |
| 30 | +- 编码和压缩算法可以用双引号、单引号包裹,也可以不带引号。 |
| 31 | + |
| 32 | +### 动态更改编码和压缩 |
| 33 | + |
| 34 | +我们目前并没有提供为一个列直接修改编码和压缩的 SQL 语法,但是可以通过两次 `ALTER TABLE` 操作实现。示例如下: |
| 35 | + |
| 36 | +- 给定 `sx1` 表的 `value` 列,它的定义为 `value REAL ENCODING RLE`。 |
| 37 | +- 使用 `ALTER TABLE sx1 DROP COLUMN value` 删除 `value` 列。 |
| 38 | +- 使用 `ALTER TABLE sx1 ADD COLUMN value REAL ENCODING DELTA_BINARY_PACKED` 添加 `value` 列,并将其 `ENCODING` 从 `RLE` 修改为 `DELTA_BINARY_PACKED`。 |
| 39 | + |
| 40 | +### 查看编码和压缩 |
| 41 | + |
| 42 | +我们目前提供两种方式查看列的编码和压缩算法: |
| 43 | + |
| 44 | +1. 通过 `SHOW CREATE TABLE <table_name>` 语法可以查看某个表的建表语句,其中包括每个列的编码和压缩算法(如果显式设置了)。 |
| 45 | +2. 通过 `SELECT <codec> FROM information_schema.columns where table = "<table_name>"` 可以从 `information_schema.columns` 系统表中查询某个表的列元信息。其中 `codec` 为 `encoding` 或 `compression`。注意,这里的 `encoding`、`compression` 必须为小写。 |
| 46 | + |
| 47 | +## 支持的编码和压缩算法 |
| 48 | + |
| 49 | +### 编码 |
| 50 | + |
| 51 | +Datalayers 支持的编码算法如下: |
| 52 | + |
| 53 | +- `PLAIN`:无特殊编码。例如 Boolean 类型编码为 1 个 byte、INT32 类型编码为 4 个 bytes。 |
| 54 | +- `RLE` |
| 55 | +- `DELTA_BINARY_PACKED` |
| 56 | +- `DELTA_LENGTH_BYTE_ARRAY` |
| 57 | +- `DELTA_BYTE_ARRAY` |
| 58 | +- `RLE_DICTIONARY` |
| 59 | +- `BYTE_STREAM_SPLIT` |
| 60 | + |
| 61 | +关于每个编码算法的定义,参考 [Apache Parquet Encoding](https://parquet.apache.org/docs/file-format/data-pages/encodings/)。 |
| 62 | + |
| 63 | +#### 默认的编码 |
| 64 | + |
| 65 | +如果没有显式指定编码算法,不同数据类型的默认编码算法为: |
| 66 | + |
| 67 | +- `Boolean`:`RLE`。 |
| 68 | +- `Int32`:`DLETA_BINARY_PACKED`。 |
| 69 | +- `Int64`:`DELTA_BINARY_PACKED`。 |
| 70 | +- `BYTE_ARRAY`:`DELTA_BYTE_ARRAY`。 |
| 71 | +- 其他类型:`PLAIN`。 |
| 72 | + |
| 73 | +#### 类型兼容性 |
| 74 | + |
| 75 | +每个编码算法兼容的类型是一定的。此处列出每个编码算法**不兼容**的类型: |
| 76 | + |
| 77 | +- `RLE`:不兼容 `String`、`Binary` 类型。 |
| 78 | +- `DELTA_BINARY_PACKED`:不兼容 `Boolean`、`Real`、`Double`、`String`、`Binary`。 |
| 79 | +- `DELTA_LENGTH_BYTE_ARRAY`:不兼容 `Boolean`。 |
| 80 | +- `DELTA_BYTE_ARRAY`:不兼容 `Boolean`。 |
| 81 | +- `BYTE_STREAM_SPLIT`:不兼容 `Boolean`、`String`、`Binary`。 |
| 82 | + |
| 83 | +### 压缩 |
| 84 | + |
| 85 | +Datalayers 支持的压缩算法包括: |
| 86 | + |
| 87 | +- `UNCOMPRESSED`:无压缩。 |
| 88 | +- `SNAPPY` |
| 89 | +- `GZIP(gzip_level)`:其中 `gzip_level` 为 `GZIP` 的压缩级别,可选值的范围为 [0, 10]。 |
| 90 | +- `BROTLI(brotli_level)`:其中 `brotli_level` 为 `BROTLI` 的压缩级别,可选值的范围为 [0, 11]。 |
| 91 | +- `LZ4` |
| 92 | +- `ZSTD(zstd_level)`:其中 `zstd_level` 为 `ZSTD` 的压缩级别,可选值的范围为 [1, 22]。 |
| 93 | +- `LZ4_RAW` |
| 94 | + |
| 95 | +关于每个压缩算法的定义,参考 [Apache Parquet Compression](https://parquet.apache.org/docs/file-format/data-pages/compression/)。 |
| 96 | + |
| 97 | +#### 注意事项 |
| 98 | + |
| 99 | +- 压缩算法作用于 byte 级别,因此与数据类型无关,Datalayers 的所有数据类型都支持配置以上任意一种压缩算法。 |
| 100 | +- 不同的压缩算法具有不同的压缩指标,包括压缩率、压缩与解压缩耗时、压缩与解压缩资源占用等。需要根据具体的场景权衡各项指标,选择合适的压缩算法。 |
| 101 | +- 通常来说,压缩级别越高,压缩后数据文件越小,即压缩率越高。但是请注意,高压缩级别会提高压缩、解压缩的耗时与资源资源。 |
| 102 | +- 如果没有显式指定压缩算法,Datalayers 默认使用 `UNCOMPRESSED`,即无压缩。 |
0 commit comments