Hive3使用代理键
- 2020 年 4 月 7 日
- 筆記
您可以使用内置的SURROGATE_KEY用户定义函数(UDF)在将数据输入表中时自动为行生成数字ID。生成的代理键可以替换多个复合键。
Hive仅在ACID表上支持代理键,如以下表类型矩阵中所述:
表类型 |
ACID |
代理键 |
文件格式 |
插入 |
更新/删除 |
---|---|---|---|---|---|
托管:CRUD事务性 |
是 |
是 |
ORC |
是 |
是 |
托管:仅插入式交易 |
是 |
是 |
任何 |
是 |
没有 |
托管:临时 |
没有 |
没有 |
任何 |
是 |
没有 |
外部 |
没有 |
没有 |
任何 |
是 |
没有 |
您要使用代理键联接的表不能具有需要转换的列类型。这些数据类型必须是原生类型,例如INT或STRING。
使用生成的键进行联接比使用字符串进行联接要快。使用生成的键不会通过行号将数据强制进入单个节点。您可以生成键作为自然键的抽象。代理键比UUID具有优势,后者速度较慢且具有概率。
SURROGATE_KEY UDF为您插入表中的每一行生成唯一的ID。它基于分布式系统中的执行环境生成键,其中包括许多因素,例如内部数据结构,表的状态和最后的事务ID。代理键生成不需要计算任务之间的任何协调。
UDF不带参数或带两个参数:
- Write Id bit
- Task ID bit
1. 以具有ACID属性的默认ORC格式创建一个学生表。
CREATE TABLE students (row_id INT, name VARCHAR(64), dorm INT);
2. 将数据插入表中。例如:
INSERT INTO TABLE students VALUES (1, 'fred flintstone', 100), (2, 'barney rubble', 200);
3. 使用SURROGATE_KEY UDF创建学生表的版本。
CREATE TABLE students_v2 (`ID` BIGINT DEFAULT SURROGATE_KEY(), row_id INT, name VARCHAR(64), dorm INT, PRIMARY KEY (ID) DISABLE NOVALIDATE);
4. 插入数据,它会自动为主键生成代理键。
INSERT INTO students_v2 (row_id, name, dorm) SELECT * FROM students;
5. 看一下代理键。
SELECT * FROM students_v2; +-----------------+---------------------+-------------------+-------------------+ | students_v2.id | students_v2.row_id | students_v2.name | students_v2.dorm | +-----------------+---------------------+-------------------+-------------------+ | 1099511627776 | 1 | fred flintstone | 100 | | 1099511627777 | 2 | barney rubble | 200 | +-----------------+---------------------+-------------------+-------------------+
6. 将代理键作为外键添加到另一个表(例如student_grades表)中,以加快表的后续联接。
ALTER TABLE student_grades ADD COLUMNS (gen_id BIGINT); MERGE INTO student_grades g USING students_v2 s ON g.row_id = s.row_id WHEN MATCHED THEN UPDATE SET gen_id = s.id;
现在,您可以在代理键上实现快速联接。
原来链接:https://docs.cloudera.com/runtime/7.0.3/using-hiveql/topics/hive_surrogate_keys.html