我一直在尝试为表格的每一行(3000万+行)生成唯一的ID。
必须有一种简单的方法来生成行ID,我想知道有没有人有解决方案。
答案 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;