Hive實現自增列的兩種方法

2021-10-01 02:49:29 字數 2450 閱讀 2490

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

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

用row_number()函式生成**鍵

[sql] view plain copy

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生成**鍵

[sql] view plain copy

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()函式。

以上摘自:博文!

心得:這裡需要強調下:

第二種方式使用為apache版本的hive。對於cdh版本hive需要在集群的中找到其相關jar,

具體步驟:

1.進入集群如[root@sdzn-server06 dm_lots]# find / -name hive-contrib-*

準確找到jar包和路經。如/opt/cloudera/parcels/cdh-5.3.6-1.cdh5.3.6.p0.11/jars/hive-contrib-0.13.1-cdh5.3.6.jar

2.將其放入到對應(自定義)的集群下的目錄

如圖3.建立函式

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

這裡需要注意org.apache.hadoop.hive.contrib.udf.udfrowsequence必須完全正確否則,建立失敗!

檢視方式:

將jar匯出並解壓,一一核對即可!

4、udf使用異常

如下:logging initialized using configuration in jar:file:/opt/cloudera/parcels/cdh-5.3.6-1.cdh5.3.6.p0.11/jars/hive-common-0.13.1-cdh5.3.6.jar!/hive-log4j.properties

failed: semanticexception [error 10004]: line 3:7 invalid table alias or column reference 'row_sequence'

如異常所提示,無效別名或者列,說明該自定義函式不可用

可能情況:

1.核對函式據(不要笑,很多人會犯這種錯誤)

2.檢視建立方式是否正確,

解決方案:

create  function dw.rows_sequence  as 'org.apache.hadoop.hive.contrib.udf.udfrowsequence' using jar 'hdfs:///udf/hive-contrib-0.13.1-cdh5.3.6.jar';

org.apache.hadoop.hive.contrib.udf.udfrowsequence:該路徑是jar解壓縮後的路徑。

這樣在hive -e中可以使用。

Hive實現自增列的兩種方法

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

Hive實現自增列的兩種方法

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

Hive實現自增列的兩種方法

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