【发布时间】:2015-03-06 06:27:04
【问题描述】:
从大数据配置单元表中选择一组记录时,需要为每条记录创建一个唯一键。在顺序操作模式下,很容易通过调用诸如 max(id) 之类的东西来生成唯一 id。由于 hive 并行运行任务,我们如何在不影响 hadoop 性能的情况下生成唯一键作为选择查询的一部分。 这真的是一个 map reduce 问题,还是我们需要采用顺序方法来解决这个问题。
【问题讨论】:
从大数据配置单元表中选择一组记录时,需要为每条记录创建一个唯一键。在顺序操作模式下,很容易通过调用诸如 max(id) 之类的东西来生成唯一 id。由于 hive 并行运行任务,我们如何在不影响 hadoop 性能的情况下生成唯一键作为选择查询的一部分。 这真的是一个 map reduce 问题,还是我们需要采用顺序方法来解决这个问题。
【问题讨论】:
使用 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)
希望对你有帮助!!
【讨论】:
如果出于某种原因您不想处理 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,但应该也可以。
【讨论】: