簡體   English   中英

Hive / Hadoop中獨特的密鑰生成

[英]Unique Key generation in Hive/Hadoop

從大數據配置單元表中選擇一組記錄時,需要為每個記錄創建唯一的鍵。 在順序操作模式下,通過調用諸如max(id)之類的東西很容易生成唯一的id。 由於hive並行運行任務,因此我們如何在不影響hadoop性能的情況下生成唯一鍵作為select查詢的一部分。 這真的是一個地圖縮小問題,還是我們需要采用一種順序方法來解決這個問題。

如果由於某種原因您不想處理UUID,則此解決方案(基於數字值)不需要並行單元相互“交談”或同步。 因此,它非常有效,但是不能保證整數鍵將是連續的。

如果您說N個並行執行單元,並且您知道N個,並且為每個單元分配了一個從0到N-1的ID,那么您只需在所有單元上生成唯一的整數

Unit #0:   0, N, 2N, 3N, ...
Unit #1:   1, N+1, 2N+1, 3N+1, ...
...
Unit #N-1: N-1, N+(N-1), 2N+(N-1), 3N+(N-1), ...

根據需要在何處生成密鑰(映射器或化簡器),可以從hadoop配置中獲取N:

Mapper: mapred.map.tasks
Reduce: mapred.reduce.tasks

...和您單位的ID:在Java中,它是:

 context.getTaskAttemptID().getTaskID().getId()

不確定Hive,但也應該可行。

使用UUID而不是數字。 它以真正的分布式方式工作。

select reflect("java.util.UUID", "randomUUID")
SELECT T.*, ROW_NUMBER () OVER (ORDER BY T.C1) AS SEQ_NBR 
FROM TABLE T

這里C1是T中的任何數字列。當從表T中選擇時,它將為每個記錄生成一個唯一的數字(從1開始)。如果這是一次活動,則解決方案很好。

如果您需要每天重復此過程並將此數據插入表T2中並生成唯一ID,則可以嘗試以下方法。

SELECT T.*, ROW_NUMBER () OVER (ORDER BY T.C1)+ SEQ_T2  AS SEQ_NBR 
FROM TABLE T, (SELECT MAX(SEQ) AS SEQ_T2 FROM TABLE T2)

希望能幫助到你 !!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM