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
