Hive實現自增列的兩種方法

2021-10-09 13:44:26 字數 1112 閱讀 9898

多維資料倉儲中的維度表和事實表一般都需要有乙個**鍵,作為這些表的主鍵,**鍵一般由單列的自增數字序列構成。hive沒有關聯式資料庫中的自增列,但它也有一些對自增序列的支援,通常有兩種方法生成**鍵:使用row_number()視窗函式或者使用乙個名為udfrowsequence的使用者自定義函式(udf)。

假設有維度表tbl_dim和過渡表tbl_stg,現在要將tbl_stg的資料裝載到tbl_dim,裝載的同時生成維度表的**鍵。

insert into tbl_dim  

select row_number() over (order by tbl_stg.id) + t2.sk_max, tbl_stg.*  

from tbl_stg 

cross join (select coalesce(max(sk),0) sk_max from tbl_dim) t2;

上面語句中,先查詢維度表中已有記錄最大的**鍵值,如果維度表中還沒有記錄,利用coalesce函式返回0。然後使用cross join連線生成過渡表和最大**鍵值的笛卡爾集,最後使用row_number()函式生成行號,並將行號與最大**鍵值相加的值,作為新裝載記錄的**鍵。

add jar hdfs:///user/hive-contrib-2.0.0.jar;  

create temporary function row_sequence as 'org.apache.hadoop.hive.contrib.udf.udfrowsequence'; 

insert into tbl_dim  

select row_sequence() + t2.sk_max, tbl_stg.*  

from tbl_stg 

cross join (select coalesce(max(sk),0) sk_max from tbl_dim) t2;

hive-contrib-2.0.0.jar中包含乙個生成記錄序號的自定義函式udfrowsequence。上面的語句先載入jar包,然後建立乙個名為row_sequence()的臨時函式作為呼叫udf的介面,這樣可以為查詢的結果集生成乙個自增偽列。之後就和row_number()寫法類似了,只不過將視窗函式row_number()替換為row_sequence()函式。

Hive實現自增列的兩種方法

多維資料倉儲中的維度表和事實表一般都需要有乙個 鍵,作為這些表的主鍵,鍵一般由單列的自增數字序列構成。hive沒有關聯式資料庫中的自增列,但它也有一些對自增序列的支援,通常有兩種方法生成 鍵 使用row number 視窗函式或者使用乙個名為udfrowsequence的使用者自定義函式 udf 假...

Hive實現自增列的兩種方法

多維資料倉儲中的維度表和事實表一般都需要有乙個 鍵,作為這些表的主鍵,鍵一般由單列的自增數字序列構成。hive沒有關聯式資料庫中的自增列,但它也有一些對自增序列的支援,通常有兩種方法生成 鍵 使用row number 視窗函式或者使用乙個名為udfrowsequence的使用者自定義函式 udf 假...

Hive實現自增列的兩種方法

多維資料倉儲中的維度表和事實表一般都需要有乙個 鍵,作為這些表的主鍵,鍵一般由單列的自增數字序列構成。hive沒有關聯式資料庫中的自增列,但它也有一些對自增序列的支援,通常有兩種方法生成 鍵 使用row number 視窗函式或者使用乙個名為udfrowsequence的使用者自定義函式 udf 假...