从大数据配置单元表中选择一组记录时,需要为每个记录创建一个唯一的键。在顺序操作模式下,通过调用像max(id)这样的soem很容易生成唯一的id。既然hive并行运行任务,那么我们如何在不影响hadoop性能的情况下,在select查询中生成唯一键呢。这真的是一个map-reduce问题,还是我们需要一个顺序的方法来解决这个问题。
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,但也应该有可能。
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)
希望有帮助!!
vptzau2j3#
使用uuid而不是数字。它以真正的分布式方式工作。
select reflect("java.util.UUID", "randomUUID")
3条答案
按热度按时间irtuqstp1#
如果出于某种原因您不想处理uuid,那么这个解决方案(基于数值)不需要您的并行单元相互“交谈”或同步。因此它是非常有效的,但是它不能保证整数键是连续的。
如果有n个并行执行单元,并且您知道自己的n,并且每个单元都被分配了一个从0到n-1的id,那么您可以简单地在所有单元中生成一个唯一的整数
根据需要生成密钥的位置(Map器或缩减器),您可以从hadoop配置中获取您的n:
... 单位id:在java中是:
不确定Hive,但也应该有可能。
gmxoilav2#
这里c1是t中的任意数字列。这将为每个记录生成一个唯一的编号,同时从表t中选择,从1开始。如果这是一次性活动,那么解决方案是好的。
如果您需要每天重复此过程,并将此数据插入表t2并生成唯一id,那么您可以尝试下面的方法。
希望有帮助!!
vptzau2j3#
使用uuid而不是数字。它以真正的分布式方式工作。