UUID 生成随机 ID
UUID 生成 36 位的随机唯一标识字符串。MaxCompute、StarRocks、Doris、Spark 和 Flink 的文档都有 UUID()。Hive 4.2.1 源码中注册了 uuid(),但官方 Wiki 没有收录。
各引擎写法
| 引擎 | 支持 | 写法 | 说明 | 依据 |
|---|---|---|---|---|
| MaxCompute | 支持 | UUID() | 返回随机的全局 ID 字符串,重复概率很小。 | 官方文档 |
| Hologres | 不支持 | — | Hologres 字符串函数文档中没有找到 UUID,需要在实例中确认。 | 待核实 |
| StarRocks | 支持 | uuid() | 返回 36 位 VARCHAR,每次调用结果不同。另有 uuid_numeric 返回数值型。 | 官方文档 |
| Doris | 支持 | UUID() | 返回 RFC 4122 格式的 36 位 VARCHAR。 | 官方文档 |
| Hive | 支持 | uuid() | 官方 Wiki 的函数列表没有 uuid,这里的依据是 Hive 4.2.1 的 FunctionRegistry 源码。 | 官方文档 |
| Spark SQL | 支持 | uuid() | Spark 2.3.0 起提供,返回 36 位字符串,属于非确定性函数。 | 官方文档 |
| Flink SQL | 支持 | UUID() | 按 RFC 4122 第 4 版生成伪随机 UUID。 | 官方文档 |
迁移注意事项
- UUID 是非确定性函数。任务失败重跑时,同一行会得到不同的 ID,下游如果用它做主键或去重键,重跑后会产生重复数据。需要稳定 ID 时,改用业务字段拼接后计算 MD5 或 SHA2。
- Spark 中非确定性函数可能因为重算而在同一作业里得到不同的值,例如 DataFrame 被多次使用但没有缓存。需要固定结果时,先落表或 cache。
示例
给每条导入记录生成批次内 ID
SELECT UUID() AS row_id, * FROM ods_import;SELECT uuid() AS row_id, * FROM ods_import;SELECT UUID() AS row_id, * FROM ods_import;SELECT uuid() AS row_id, * FROM ods_import;SELECT uuid() AS row_id, * FROM ods_import;SELECT UUID() AS row_id, * FROM ods_import;