hive/hadoop中的java唯一密钥生成

svgewumm  于 2021-05-30  发布在  Hadoop
关注(0)|答案(3)|浏览(450)

从大数据配置单元表中选择一组记录时,需要为每个记录创建一个唯一的键。在顺序操作模式下,通过调用像max(id)这样的soem很容易生成唯一的id。既然hive并行运行任务,那么我们如何在不影响hadoop性能的情况下,在select查询中生成唯一键呢。这真的是一个map-reduce问题,还是我们需要一个顺序的方法来解决这个问题。

irtuqstp

irtuqstp1#

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

根据需要生成密钥的位置(Map器或缩减器),您可以从hadoop配置中获取您的n:

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

... 单位id:在java中是:

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

不确定Hive,但也应该有可能。

gmxoilav

gmxoilav2#

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)

希望有帮助!!

vptzau2j

vptzau2j3#

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

select reflect("java.util.UUID", "randomUUID")

相关问题