从大数据配置单元表中选择一组记录时,需要为每条记录创建唯一键。在顺序操作模式中,通过调用诸如max(id)之类的东西很容易生成唯一id。由于hive并行运行任务,我们如何在不影响hadoop性能的情况下生成唯一键作为select查询的一部分。 这真的是一个地图减少问题,还是我们需要采用顺序方法来解决这个问题。
答案 0 :(得分:3)
如果由于某种原因你不想处理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), ...
根据您需要生成密钥的位置(mapper或reducer),您可以从hadoop配置中获取N:
Mapper: mapred.map.tasks
Reduce: mapred.reduce.tasks
...和您单位的身份证明: 在Java中,它是:
context.getTaskAttemptID().getTaskID().getId()
不确定Hive,但也应该可以。
答案 1 :(得分:0)
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)
希望它有所帮助!!
答案 2 :(得分:0)
使用UUID代替数字。它以真正的分布式方式工作。
select reflect("java.util.UUID", "randomUUID")