在蜂巢中生成唯一ID

use*_*713 9 hash hadoop hive identifier

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

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

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

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

小智 20

使用反射UDF生成UUID.

reflect("java.util.UUID", "randomUUID")
Run Code Online (Sandbox Code Playgroud)


jtr*_*ini 7

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

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

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


小智 5

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

INPUT__FILE__NAME, BLOCK__OFFSET__INSIDE__FILE
Run Code Online (Sandbox Code Playgroud)

像这样使用:

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  
...
Run Code Online (Sandbox Code Playgroud)

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

select
Md5(concat(INPUT__FILE__NAME, ':', BLOCK__OFFSET__INSIDE__FILE)) as rowkey,
...
Run Code Online (Sandbox Code Playgroud)

  • 注意:虚拟列使用双下划线:`INPUT__FILE__NAME` `BLOCK__OFFSET__INSIDE__FILE` (2认同)