在Redshift中将字母数字字符串转换为唯一整数用于ETL去重
多列主键拼接字符串转唯一数字的实现方案
一、能否转换为保留唯一性的数字?
可以,但需注意并非所有场景都能实现无冲突转换:
- 若拼接后的字符串长度、字符集有限,理论上可通过一一映射生成唯一数字;
- 若字符串长度无上限,受限于数字类型的存储容量(比如64位整数最大值为9e18),无法实现完全无冲突转换,此时需结合哈希+冲突处理,或改用大数字类型(如数据库的DECIMAL)。
二、字符映射转数字的常用方法
1. 基于字符编码的直接映射
将每个字符转换为对应编码值(如ASCII码、Unicode码点),再以字符集大小为进制,将编码值作为数位组合成大数字:
- 示例:对
jesse_20230431_low,拆分字符为j(106)、e(101)、s(115)等,以ASCII的128为进制计算对应十进制数; - 缺点:字符串稍长就会超出常规数字类型存储范围,需用支持大数字的工具或数据库类型。
2. 自定义字符映射表
针对业务中出现的字符预先定义唯一数字映射(比如j=1、e=2、_=4、数字0-9对应0-9),再按字符串顺序组合成数字:
- 示例:
jesse_20230431_low可转成123324202304314125(假设l=1、o=2、w=5); - 优点:可根据业务字符集缩小进制,减少数字长度;
- 缺点:需维护映射表,出现未定义字符时需及时更新,否则会出错。
3. 哈希函数转换(带冲突处理)
若无需严格一一映射,仅需数字实现去重,可使用哈希函数(如MD5、CRC32)将字符串转成数字:
- 操作:比如在MySQL中,用
CONV(SUBSTRING(MD5(拼接字符串),1,16),16,10)将哈希结果转成64位整数; - 注意:哈希函数存在极小碰撞概率,对唯一性要求极高时,需额外添加冲突检测(比如同时存储原拼接字符串,冲突时用其他哈希函数或追加标识区分)。
4. 数据库内置函数实现
多数ETL常用数据库有内置函数直接处理:
- 比如PostgreSQL的
hashtext()可直接将字符串转成整数; - 或用
encode(convert_to(拼接字符串, 'UTF8'), 'hex')转成十六进制字符串,再转成十进制数字。
三、ETL场景下的建议
- 若拼接字符串长度较短,优先用字符编码进制转换或自定义映射表,保证完全唯一;
- 若字符串较长,或ETL工具支持哈希+冲突检测,用哈希函数更高效;
- 若仅为去重,无需强制转成数字,直接用拼接后的字符串作为唯一键即可,多数数据库和ETL工具都支持字符串类型的去重操作。
内容的提问来源于stack exchange,提问作者DJC
相关产品推荐
相关产品推荐

