hive序列生成 Hive實現自增列的兩種方法

2021-10-13 02:18:47 字數 1664 閱讀 5332

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

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

用row_number()函式生成**鍵

insertintotbl_dim

selectrow_number() over (orderbytbl_stg.id) + t2.sk_max, tbl_stg.*

fromtbl_stg

crossjoin(selectcoalesce(max(sk),0) sk_maxfromtbl_dim) t2;

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

用udfrowsequence生成**鍵

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

createtemporaryfunctionrow_sequenceas'org.apache.hadoop.hive.contrib.udf.udfrowsequence';

insertintotbl_dim

selectrow_sequence() + t2.sk_max, tbl_stg.*

fromtbl_stg

crossjoin(selectcoalesce(max(sk),0) sk_maxfromtbl_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匯出並解壓,一一核對即可!

摘自:博文!

Hive虛擬列 翻譯自Hive wiki

hive 0.8.0支援兩個虛擬列 block offset inside file,當前全域性檔案的偏移量。對於塊壓縮檔案,就是當前塊的檔案偏移量,即當前塊的第乙個位元組在檔案中的偏移量。select input file name,key,block offset inside file fro...

Hive實現自增列的兩種方法

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

Hive實現自增列的兩種方法

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