多維資料倉儲中的維度表和事實表一般都需要有乙個**鍵,作為這些表的主鍵,**鍵一般由單列的自增數字序列構成。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 假...