![](/img/trans.png)
[英]Serial Key Generation and Validation in Java (Machine Unique Identifier)
[英]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.