Hive3使用代理鍵

您可以使用內置的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