吃透大数据算法-字典编码(Dictionary Encoding)
一、趣味场景:超市盘点的 “文字灾难” 与 “编码拯救”
小明是 “惠民超市” 的新实习生,第一次负责月末盘点 —— 要把货架上所有商品的名称、数量录入系统。可他刚写了 3 行就崩溃了:
- 第 1 行:农夫山泉 550ml 天然矿泉水(货架 A1)
- 第 2 行:农夫山泉 550ml 天然矿泉水(货架 A2)
- 第 3 行:农夫山泉 550ml 天然矿泉水(货架 A3)
“同样的名字要写几十遍,手都酸了!” 店长老王看了笑着递给他一张纸:“用‘简称编码’呀,比如把‘农夫山泉 550ml 天然矿泉水’记成‘N1’,盘点表能省一半字数!”
原值 | 编码值 |
农夫山泉 550ml 天然矿泉水 | N1 |
伊利纯牛奶 250ml | N2 |
小明照着做,很快整理出两张表:
- “字典表”:记录 “全称→编码” 的对应关系(比如 N1 = 农夫山泉 550ml,N2 = 伊利纯牛奶 250ml...);
- “编码盘点表”:只用编码记录商品(比如 A1:N1、A2:N1、A3:N1...)。
原本要写 2 小时的盘点表,15 分钟就完成了 —— 这就是字典编码的核心逻辑:用 “短编码” 替代 “重复出现的长值”,减少存储量、提高处理效率。
二、字典编码核心原理:3 步实现 “长值变短码”
字典编码本质是 “建立映射→替换数据→存储映射 + 编码” 的过程,结合超市场景的原理流程图如下:
核心原理拆解
- 提取唯一值(建字典):从原始数据中筛选出所有不重复的 “长值”(如不同商品全称),为每个唯一值分配一个 “短编码”(通常是整数、短字符串),形成 “字典表”;
- 替换重复值(编数据):遍历原始数据,用字典表中的 “短编码” 替换对应的 “长值”,生成体积更小的 “编码后数据”;
- 联合存储(保映射):最终存储 “字典表 + 编码后数据”—— 读取时需先通过字典表还原编码对应的原始值,再使用数据。
三、字典编码的 4 大常见变种:表格对比
不同场景下,字典编码会衍生出 “静态 / 动态”“整数 / 前缀” 等变种,核心差异在于 “字典是否固定” 和 “编码方式”,具体如下:
变种类型 | 核心特点 | 适用场景 | 优势 | 劣势 |
---|---|---|---|---|
静态字典编码 | 字典表在数据处理前预先建立,处理过程中不新增或修改字典 | 数据值固定、重复率高的场景(如商品类别、性别) | 编码 / 解码速度快,无需动态维护字典 | 无法处理新增的未收录值(如新增商品) |
动态字典编码 | 字典表在数据处理中动态生成:遇到新值时自动添加到字典,更新编码映射 | 数据值动态新增的场景(如用户 ID、订单号) | 灵活支持新值,适配变化的数据 | 动态维护字典会消耗额外资源,编码速度略慢 |
整数字典编码 | 编码用 “整数”(如 1、2、3)替代原始值,是最基础的变种 | 几乎所有场景(字符串、枚举值等) | 编码长度最短,计算 / 存储效率最高 | 仅适合 “唯一值数量较少” 的场景(否则整数编码变长) |
前缀字典编码 | 对 “有前缀关联的值”(如 “北京朝阳”“北京海淀”)建立 “前缀共享字典”,编码复用前缀 | 数据值有层级 / 前缀关联的场景(如地址、文件路径) | 进一步减少字典体积,重复前缀越多省越多 | 需额外处理前缀关联,逻辑较复杂 |
四、字典编码在大数据组件中的应用:表格说明
大数据场景中,字典编码是 “压缩数据、加速查询” 的核心技术之一,主流组件的应用场景如下:
大数据组件 | 字典编码使用场景 | 采用的变种类型 | 核心作用 |
---|---|---|---|
Parquet | 对字符串列、枚举列(如用户性别、商品类别)进行压缩 | 静态字典编码(默认) | 减少列存储体积,提升查询时的 I/O 效率 |
ORC | 支持对所有数据类型(含数值型)的字典编码 | 动态字典编码(可选) | 适配动态新增数据,平衡压缩率和灵活性 |
Spark | Shuffle 阶段对 Key 值编码、DataFrame 字符串列压缩 | 动态字典编码 | 减少 Shuffle 数据传输量,加速分布式计算 |
Kylin | 针对维度列(尤其字符串维度)应用,适配 OLAP 多维度聚合分析场景 | 采用全局静态字典编码 | 将字符串转整数,缩减存储,加速 Cube 聚合计算与 OLAP 查询响应 |
Kafka | 对消息中的重复字段(如 Topic 固定字段)编码 | 结合动态 / 前缀字典,适配流式新增值 | 减少消息传输带宽,提升生产 / 消费效率 |
五、总结:字典编码的 “灵魂”
字典编码的核心价值不是 “编码本身”,而是 “利用数据的重复性”—— 重复值越多,编码后节省的存储和提升的效率越明显。就像超市里 “农夫山泉” 卖得越多,用 “N1” 替代全称的收益就越大,这也是它能成为大数据领域 “基础压缩技术” 的关键原因。
六、与RLE的配合
- 字典编码先 “瘦身”:把 “农夫山泉 550ml” 这种长值转成短码 “N1”,解决 “单个值占空间大” 的问题;
- RLE 再 “去重”:统计短码的重复次数(如 20 个 N1),用 “编码 + 次数” 替代重复序列,解决 “重复值占行数多” 的问题。(RLE相关文章可见同属专栏)