哈希代理键是什么
哈希代理键是把自然键按固定规则拼接后做一次哈希运算,把结果直接当作维表主键。它不需要序列、不需要集中发号,任何节点都能独立算出同一个值:同一个客户在事实表、维表和别的域里算出的 sk 完全一致。这是它相对自增序列键的最大优势——加载可完全并行,历史重算也不会产生新键。
基本信息
| 常用算法 | md5 / sha1 / sha256 / xxhash64 |
|---|---|
| 生成方式 | 无状态纯函数,同输入同输出 |
| 键类型 | 字符串(md5/sha1)或 bigint(xxhash64) |
| 适用平台 | Hive / Spark / Flink / PostgreSQL 均可 |
| 主要代价 | 键变长、不可读、存在理论碰撞 |
典型使用场景
- 事实表与维表在同一作业生成,不依赖维表先落库,可并行执行
- 历史数据回滚重算:键由数据本身决定,重算结果与现状一致
- 多源合并:把源系统标识拼进输入串,避免不同系统的编号互相撞键
- 流批一体:流任务与批任务用同一个表达式,键天然对齐
- 按自然键关联时省去一次维表查询
生成哈希键
生成哈希键
-- 拼接规则一旦定下就不能改:前缀、分隔符、去空格、大小写
SELECT md5(concat_ws('|', 'CUST', upper(trim(customer_id)))) AS customer_sk
FROM stg_customer;
-- xxhash64 输出 bigint,更短更快,碰撞概率仍可接受
SELECT xxhash64(concat_ws('|', 'CUST', trim(customer_id))) AS customer_sk
FROM stg_customer;算法选择对照
| 算法 | 输出 | 特点 | 适用 |
|---|---|---|---|
| md5 | 32 位十六进制 | 快、体积适中 | 大多数维表 |
| sha1 | 40 位十六进制 | 抗碰撞强于 md5 | 安全要求较高 |
| xxhash64 | bigint | 存储省、速度快 | 追求性能的宽维表 |
| sha256 | 64 位十六进制 | 最保守 | 极低碰撞要求 |
哈希键不可读、不可排序,不能当作对外单号展示;对外仍用业务编码。拼接规则要写进维度规范并在所有作业里复用,任何一处写法不同就会算出两个键。
哈希碰撞在中小数据量下几乎不会出现,但维表到数十亿行且用短哈希时风险上升。做法是加载后比对 count(*) 与 count(distinct sk),发现重复立即换算法重建,别等关联错乱才发现。