1. 程式人生 > >Hive實現自增列的兩種方法

Hive實現自增列的兩種方法

  多維資料倉庫中的維度表和事實表一般都需要有一個代理鍵,作為這些表的主鍵,代理鍵一般由單列的自增數字序列構成。Hive沒有關係資料庫中的自增列,但它也有一些對自增序列的支援,通常有兩種方法生成代理鍵:使用row_number()視窗函式或者使用一個名為UDFRowSequence的使用者自定義函式(UDF)。
  假設有維度表tbl_dim和過渡表tbl_stg,現在要將tbl_stg的資料裝載到tbl_dim,裝載的同時生成維度表的代理鍵。
  • 用row_number()函式生成代理鍵
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()函式生成行號,並將行號與最大代理鍵值相加的值,作為新裝載記錄的代理鍵。
  • 用UDFRowSequence生成代理鍵
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()函式。