在蜂巢中生成唯一ID

问题描述 投票:6回答:8

我一直在尝试为表的每一行(3000万+行)生成唯一的ID。

  • 由于Hadoop的并行特性,使用序列号显然不起作用。
  • 内置的UDFs rand()和hash(rand(),unixtime())似乎会产生冲突。

必须有一种简单的方法来生成行ID,我想知道有没有人有解决方案。

  • 我的下一步是创建一个Java map reduce作业,以生成一个真正的哈希字符串,其中包含一个安全的随机+主机IP +当前时间作为种子。但我想在做之前我会问这里;)
hadoop hash hive identifier
8个回答
18
投票

使用反射UDF生成UUID。

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

6
投票

不确定这是否有用,但是这里......

考虑本机MapReduce模拟:假设您的输入数据集是基于文本的,对于每一行,输入Mapper的密钥(以及因此唯一ID)将是文件的名称加上其字节偏移量。

当您将数据加载到Hive时,如果您可以创建一个包含此信息的额外“列”,则可以免费获得您的rowID。它在语义上毫无意义,但您在上面提到的方法也是如此。


4
投票

通过jtravaglini对答案进行阐述,自0.8.0以来有2个内置的Hive虚拟列可用于生成唯一标识符:

INPUT__FILE__NAME, BLOCK__OFFSET__INSIDE__FILE

使用这样:

select
concat(INPUT__FILE__NAME, ':', BLOCK__OFFSET__INSIDE__FILE) as rowkey,  
...  
;  
...  
OK  
hdfs://<nodename>:8020/user/dhdpadmn/training/training_data/nyse/daily/NYSE_daily2.txt:0
hdfs://<nodename>:8020/user/dhdpadmn/training/training_data/nyse/daily/NYSE_daily2.txt:57
hdfs://<nodename>:8020/user/dhdpadmn/training/training_data/nyse/daily/NYSE_daily2.txt:114
hdfs://<nodename>:8020/user/dhdpadmn/training/training_data/nyse/daily/NYSE_daily2.txt:171
hdfs://<nodename>:8020/user/dhdpadmn/training/training_data/nyse/daily/NYSE_daily2.txt:228
hdfs://<nodename>:8020/user/dhdpadmn/training/training_data/nyse/daily/NYSE_daily2.txt:285
hdfs://<nodename>:8020/user/dhdpadmn/training/training_data/nyse/daily/NYSE_daily2.txt:342  
...

或者您可以使用md5或类似名称对其进行匿名处理,这里是指向md5 UDF的链接:https://gist.github.com/dataminelab/1050002 (注意函数类名是initcap'Md5')

select
Md5(concat(INPUT__FILE__NAME, ':', BLOCK__OFFSET__INSIDE__FILE)) as rowkey,
...

1
投票

反映( “java.util.UUID中”, “randomUUID”)

我无法对另一个投票。我需要一个纯二进制版本,所以我使用了这个:

unhex(regexp_replace(reflect('java.util.UUID','randomUUID'),' - ',''))


0
投票

根据您的工作性质以及您计划运行它们的频率,使用序号可能实际上是一个合理的选择。您可以按照rank()中的描述实现this other SO question UDF。


0
投票

编写一个自定义Mapper,为每个Map任务保留一个计数器,并为一行创建JobID()(从MR API获得)+计数器当前值的串行ID。在检查下一行之前,递增计数器。


0
投票

如果您想使用多个映射器和大型数据集,请尝试使用此UDF:https://github.com/manojkumarvohra/hive-hilo

它利用zookeeper作为中央存储库来维护序列状态并生成唯一的递增数值


0
投票

使用ROW_NUMBER函数生成单调递增的整数id。

select ROW_NUMBER() OVER () AS id from t1;

https://community.hortonworks.com/questions/58405/how-to-get-the-row-number-for-particular-values-fr.html

© www.soinside.com 2019 - 2024. All rights reserved.