Hive/Hadoop 中的唯一密钥生成



从大数据配置单元表中选择一组记录时,需要为每个记录创建一个唯一键。在顺序操作模式下,很容易通过调用类似 max(id) 的东西来生成唯一的 id。由于 hive 并行运行任务,我们如何在不影响 hadoop 性能的情况下生成唯一键作为选择查询的一部分。这真的是一个地图减少问题,还是我们需要采用顺序方法来解决这个问题。

如果由于某种原因您不想处理 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)

希望有帮助!!

最新更新