当前位置: 首页 > news >正文

吃透大数据算法-字典编码(Dictionary Encoding)

一、趣味场景:超市盘点的 “文字灾难” 与 “编码拯救”

小明是 “惠民超市” 的新实习生,第一次负责月末盘点 —— 要把货架上所有商品的名称、数量录入系统。可他刚写了 3 行就崩溃了:

  • 第 1 行:农夫山泉 550ml 天然矿泉水(货架 A1)
  • 第 2 行:农夫山泉 550ml 天然矿泉水(货架 A2)
  • 第 3 行:农夫山泉 550ml 天然矿泉水(货架 A3)

“同样的名字要写几十遍,手都酸了!” 店长老王看了笑着递给他一张纸:“用‘简称编码’呀,比如把‘农夫山泉 550ml 天然矿泉水’记成‘N1’,盘点表能省一半字数!”

原值编码值
农夫山泉 550ml 天然矿泉水N1
伊利纯牛奶 250mlN2

小明照着做,很快整理出两张表:

  1. “字典表”:记录 “全称→编码” 的对应关系(比如 N1 = 农夫山泉 550ml,N2 = 伊利纯牛奶 250ml...);
  2. “编码盘点表”:只用编码记录商品(比如 A1:N1、A2:N1、A3:N1...)。

原本要写 2 小时的盘点表,15 分钟就完成了 —— 这就是字典编码的核心逻辑:用 “短编码” 替代 “重复出现的长值”,减少存储量、提高处理效率。

二、字典编码核心原理:3 步实现 “长值变短码”

字典编码本质是 “建立映射→替换数据→存储映射 + 编码” 的过程,结合超市场景的原理流程图如下:

核心原理拆解

  1. 提取唯一值(建字典):从原始数据中筛选出所有不重复的 “长值”(如不同商品全称),为每个唯一值分配一个 “短编码”(通常是整数、短字符串),形成 “字典表”;
  2. 替换重复值(编数据):遍历原始数据,用字典表中的 “短编码” 替换对应的 “长值”,生成体积更小的 “编码后数据”;
  3. 联合存储(保映射):最终存储 “字典表 + 编码后数据”—— 读取时需先通过字典表还原编码对应的原始值,再使用数据。

三、字典编码的 4 大常见变种:表格对比

不同场景下,字典编码会衍生出 “静态 / 动态”“整数 / 前缀” 等变种,核心差异在于 “字典是否固定” 和 “编码方式”,具体如下:

变种类型核心特点适用场景优势劣势
静态字典编码字典表在数据处理前预先建立,处理过程中不新增或修改字典数据值固定、重复率高的场景(如商品类别、性别)编码 / 解码速度快,无需动态维护字典无法处理新增的未收录值(如新增商品)
动态字典编码字典表在数据处理中动态生成:遇到新值时自动添加到字典,更新编码映射数据值动态新增的场景(如用户 ID、订单号)灵活支持新值,适配变化的数据动态维护字典会消耗额外资源,编码速度略慢
整数字典编码编码用 “整数”(如 1、2、3)替代原始值,是最基础的变种几乎所有场景(字符串、枚举值等)编码长度最短,计算 / 存储效率最高仅适合 “唯一值数量较少” 的场景(否则整数编码变长)
前缀字典编码对 “有前缀关联的值”(如 “北京朝阳”“北京海淀”)建立 “前缀共享字典”,编码复用前缀数据值有层级 / 前缀关联的场景(如地址、文件路径)进一步减少字典体积,重复前缀越多省越多需额外处理前缀关联,逻辑较复杂

四、字典编码在大数据组件中的应用:表格说明

大数据场景中,字典编码是 “压缩数据、加速查询” 的核心技术之一,主流组件的应用场景如下:

大数据组件字典编码使用场景采用的变种类型核心作用
Parquet对字符串列、枚举列(如用户性别、商品类别)进行压缩静态字典编码(默认)减少列存储体积,提升查询时的 I/O 效率
ORC支持对所有数据类型(含数值型)的字典编码动态字典编码(可选)适配动态新增数据,平衡压缩率和灵活性
SparkShuffle 阶段对 Key 值编码、DataFrame 字符串列压缩动态字典编码减少 Shuffle 数据传输量,加速分布式计算
Kylin针对维度列(尤其字符串维度)应用,适配 OLAP 多维度聚合分析场景采用全局静态字典编码将字符串转整数,缩减存储,加速 Cube 聚合计算与 OLAP 查询响应
Kafka对消息中的重复字段(如 Topic 固定字段)编码结合动态 / 前缀字典,适配流式新增值减少消息传输带宽,提升生产 / 消费效率

五、总结:字典编码的 “灵魂”

字典编码的核心价值不是 “编码本身”,而是 “利用数据的重复性”—— 重复值越多,编码后节省的存储和提升的效率越明显。就像超市里 “农夫山泉” 卖得越多,用 “N1” 替代全称的收益就越大,这也是它能成为大数据领域 “基础压缩技术” 的关键原因。

六、与RLE的配合

  1. 字典编码先 “瘦身”:把 “农夫山泉 550ml” 这种长值转成短码 “N1”,解决 “单个值占空间大” 的问题;
  2. RLE 再 “去重”:统计短码的重复次数(如 20 个 N1),用 “编码 + 次数” 替代重复序列,解决 “重复值占行数多” 的问题。(RLE相关文章可见同属专栏)
http://www.dtcms.com/a/438765.html

相关文章:

  • 从pty驱动学习tty设备驱动加载
  • 车牌号黑名单校验功能实现说明
  • 【第五章:计算机视觉-项目实战之生成对抗网络实战】2.基于SRGAN的图像超分辨率实战-(1)实战1:人脸表情生成实战任务详解
  • 【双指针专题】之快乐数
  • 锦州滨海新区城市建设规划网站建设局是个好单位吗
  • 域名搭建网站域名一般在哪里购买
  • 拦截器Interceptor
  • 运营网站流程ui设计的定义
  • 可以做自己的单机网站网站客户案例的
  • 网络编程中UDP协议的广播和组播通信
  • STM32G474单片机开发入门(一)STM32G474RET6单片机详解
  • W3C 简介
  • 菲律宾宿务Cebu(宿雾)介绍
  • Python中如何实现多级缓存
  • 深入掌握 FluentMigrator:C#.NET 数据库迁移框架详解
  • 快速做网站套餐光谷网站建设哪家好
  • 基本定时器(TIM6、TIM7)的基本介绍
  • 荆州网站建设兼职旅游网站功能简介
  • 有关做美食的网站android源码下载网站
  • Ubuntu中部署docker教程及使用指南(易用版)
  • c++之基础A(系统函数)(第一课)
  • 使用scrollview 时,自动滚动条和视图大于子view时居中显示
  • 如何最小阻力练习软件测试相关的英语口语
  • 专门做视频点评的网站iis 新建网站没有文件夹权限
  • 【完整源码+数据集+部署教程】 小麦病害分割系统: yolov8-seg-dyhead
  • Java 黑马程序员学习笔记(进阶篇16)
  • 自适应网站功能网站开发开发的前景
  • 整套网站设计网络服务费
  • python autocad comtypes+pyautocad二次开发 pywin32连不上高版本cad解决办法
  • Linux——0:安装与配置、命令、gcc