多維數據倉庫中的維度表和事實表一般都需要有一個代理鍵,作為這些表的主鍵,代理鍵一般由單列的自增數字序列構成。Hive沒有關系數據庫中的自增列,但它也有一些對自增序列的支持,通常有兩種方法生成代理鍵:使用row_number()窗口函數或者使用一個名為UDFRowSequence的用戶自定義函數(UDF)。
用row_number()函數生成代理鍵
INSERT OVERWRITE TABLE my_hive_table select row_number() over (order by create_time asc) as id, key from my_mid_table
用UDFRowSequence生成代理鍵
add jar viewfs://hadoop-meituan/user/hadoop-data/user_upload/weichao05_hive-contrib-3.1.0.jar; create temporary function row_sequence as 'org.apache.hadoop.hive.contrib.udf.UDFRowSequence'; INSERT OVERWRITE TABLE my_test_table select row_sequence() as id, key from my_mid_table
hive-contrib-3.1.0.jar中包含一個生成記錄序號的自定義函數udfrowsequence。上面的語句先加載JAR包,然后創建一個名為row_sequence()的臨時函數作為調用UDF的接口,這樣可以為查詢的結果集生成一個自增偽列。之后就和row_number()寫法類似了,只不過將窗口函數row_number()替換為row_sequence()函數。
以上兩種方法,第二種的性能要由於第一種,第一種執行慢,且當數據超過約幾千萬(本人經驗超過4千萬)時,就報內存不夠的了,這個可能與hadoop的資源配置也有關系,而第二中方法在數據超過1.5億的情況下依然能夠快速運行。