Reference · 术语
Parquet 术语表
和同事对齐说法用。每条配一句工程语言翻译,右列标出它在哪一课讲透。
文件结构
| 术语 | 中文 | 一句话 | 课次 |
|---|---|---|---|
| Row Group | 行组 | 一批行的横切,包含这批行的所有列。并行与跳过的单位。pyarrow 默认 1,048,576 行,DuckDB 默认 122,880 行 | L2 |
| Column Chunk | 列块 | 某个 row group 里某一列的全部数据,字节连续。I/O 的单位——一次连续读取 | L2 |
| Page | 页 | column chunk 内的小块。编码与压缩的单位。pyarrow 默认 1 MB 或 20000 行,谁先到算谁 | L2 |
| Dictionary Page | 字典页 | 一列在本 row group 内出现过的不同值,只存一份。数据页存的是它的下标 | L3 |
| Footer | 文件元数据 | 文件尾部的"目录":schema + 每块的偏移量、体积、统计。元数据在尾部是为了单遍写入 | L2 |
| PAR1 | 魔数 | 文件首尾各 4 字节的标识。尾部结构是 [footer][4 字节小端长度][PAR1] | L2 |
| Physical Type | 物理类型 | 磁盘上真正的存法,只有 7 种:BOOLEAN / INT32 / INT64 / INT96(废弃) / FLOAT / DOUBLE / BYTE_ARRAY / FIXED_LEN_BYTE_ARRAY | L2 |
| Logical Type | 逻辑类型 | 物理类型之上的语义标注:STRING(BYTE_ARRAY)、TIMESTAMP(INT64)、DECIMAL、UUID 等 | L2 |
| Definition / Repetition Level | 定义/重复层级 | 嵌套结构打平后的两串小整数:前者记"null 出现在哪一层",后者记"是不是同一个 list 的延续"。来自 Google Dremel 论文。平表用不上 | L2 |
编码与压缩
| 术语 | 中文 | 一句话 | 课次 |
|---|---|---|---|
| Encoding | 编码 | 懂语义的压缩:知道这列是递增整数还是重复字符串,按语义压。收益常是数量级 | L3 |
| Compression | 压缩 | 不懂语义的通用压缩(zstd / snappy / gzip),只找字节重复模式。作用在编码之后 | L3 |
| PLAIN | 原样编码 | 按小端直接存。兜底方案,数据毫无规律时反而最优 | L3 |
| RLE_DICTIONARY | 字典 + 游程 | 建"值→下标"表,数据页只存下标,下标再用游程/位打包压。写入器默认开,适合低基数列 | L3 |
| DELTA_BINARY_PACKED | 差分编码 | 只存相邻值的差。时序数据的头号武器——实测把等间隔时间戳列从 7.85 MB 压到 0.03 MB | L3 |
| DELTA_BYTE_ARRAY | 前缀压缩 | 存"与上个值共享的前缀长度 + 后缀"。适合有序且有共同前缀的字符串(路径、URL) | L3 |
| BYTE_STREAM_SPLIT | 字节流拆分 | 把浮点数的第 1、2、3… 字节各归一条流。需实测——本课程样本上是负收益 | L3 |
| 字典抢跑 | — | 本课程的说法:字典编码优先级最高,不显式收窄 use_dictionary,你指定的其他编码不生效 | L3 |
统计与跳过
| 术语 | 中文 | 一句话 | 课次 |
|---|---|---|---|
| Predicate Pushdown | 谓词下推 | 把 WHERE 条件推到读取层,用统计信息判断"这块能不能整块跳过" | L4 |
| Projection Pushdown | 列裁剪 | 只读查询用到的列。永远生效的一层,所以 SELECT * 在列存上有真实代价 | L4 |
| Statistics | 统计信息 | 每个 row group 每列的 min / max / null 数,存在 footer 里。用 min_value/max_value,别用已废弃的 min/max | L2 |
| Page Index | 页索引 | 把每一页的 min/max 也集中到 footer。含 ColumnIndex(按值找页)和 OffsetIndex(按行号找页)。pyarrow 默认不写 | L4 |
| Bloom Filter | 布隆过滤器 | 能确定回答"这块肯定没有 X"的紧凑位图。只在高基数 + 等值点查 + 非排序键三条同时成立时才值得开 | L4 |
| Sorting Columns | 排序键 | 写入时的物理排序顺序。写入侧最重要的一个决定——决定 row group 统计能不能跳过。实测差 5 倍 | L4 |
| Cardinality | 基数 | 一列里不同值的个数。低基数(租户、楼栋、状态)适合字典;高基数(UUID、时间戳)不适合 | L3 |
数据集与生态
| 术语 | 中文 | 一句话 | 课次 |
|---|---|---|---|
| Hive Partitioning | Hive 分区 | 把列值编进目录名(day=2026-01-08/),引擎看目录就能排除。文件之外的一层过滤 | L5 |
| Small File Problem | 小文件问题 | 文件太多太小 → 元数据开销暴涨、压缩效果变差、open/close 次数压垮性能。实测:文件数 ×200 → 体积 ×2.2、查询慢 13–50 倍 | L5 |
| Compaction | 合并压实 | 把一个分区里的碎片文件读出来重排重写成大文件。裸目录上不是原子操作 | L5 |
| Schema Evolution | 模式演进 | 表结构随时间变化。裸 Parquet 只有"加可空列 + union_by_name"是真正安全的 | L5 |
| Table Format | 表格式 | Parquet 之上的一层(Iceberg / Delta / Hudi),提供事务、时间旅行、行级更新、schema 管理。底下存的仍是 Parquet | L6 |
| Variant | 变体类型 | 2025 年引入的半结构化原生类型(metadata + value 双 binary),配合 shredding 把热字段抽成强类型列。官方点名 IoT 场景,但生态尚在铺开 | L6 |
| Shredding | 字段抽取 | 把 Variant 里高频访问的字段单独抽成 Parquet 列,让它重新享受编码、压缩与统计 | L6 |
| ORC / Avro | — | 另外两种格式。ORC 与 Parquet 定位几乎相同(Hive 生态更常见);Avro 是行存,适合流式传输与写入,不适合分析扫描 | L1 |