在蜂巢中生成唯一ID

时间:2013-08-15 17:59:47

标签: hadoop hash hive identifier

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

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

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

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

8 个答案:

答案 0 :(得分:17)

使用反射UDF生成UUID。

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

答案 1 :(得分:6)

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

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

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

答案 2 :(得分:3)

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

INPUT_ FILE _NAME,BLOCK_ OFFSET _INSIDE__FILE

像这样使用:

选择 concat(INPUT_ FILE _NAME,':',BLOCK_ OFFSET _INSIDE__FILE)作为rowkey,
...
;
...
OK
HDFS://:8020 /用户/ dhdpadmn /训练/ training_data / NYSE /每日/ NYSE_daily2.txt:0 HDFS://:8020 /用户/ dhdpadmn /培训/ training_data / NYSE /每天/ NYSE_daily2.txt:57 HDFS://:8020 /用户/ dhdpadmn /训练/ training_data / NYSE /每日/ NYSE_daily2.txt:114 HDFS://:8020 /用户/ dhdpadmn /培训/ training_data / NYSE /每天/ NYSE_daily2.txt:171 HDFS://:8020 /用户/ dhdpadmn /培训/ training_data / NYSE /每天/ NYSE_daily2.txt:228 HDFS://:8020 /用户/ dhdpadmn /培训/ training_data / NYSE /每天/ NYSE_daily2.txt:285 HDFS://:8020 /用户/ dhdpadmn /训练/ training_data / NYSE /每日/ NYSE_daily2.txt:342
...

或者你可以使用md5或类似的东西进行分类,这里是md5 UDF的链接: https://gist.github.com/dataminelab/1050002
(注意函数类名称是initcap'Md5')

选择 Md5(concat(INPUT_ FILE _NAME,':',BLOCK_ OFFSET _INSIDE__FILE))作为rowkey, ...

答案 3 :(得分:1)

反映(" java.util.UUID"," randomUUID")

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

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

答案 4 :(得分:0)

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

中所述实施rank() UDF

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

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

答案 7 :(得分: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

相关问题