我经常在Hadoop作业中分配随机ID。您只需要确保生成包含足够数量的随机位的ID,以确保冲突的概率足够小(http://en.wikipedia.org/wiki/Birthday_problem)。
根据经验,我使用3 * log(n)个随机位,其中n =需要生成的ID数。
在许多情况下,Java的UUID.randomUUID()就足够了。
http://en.wikipedia.org/wiki/Universally_unique_identifier#Random_UUID_probability_of_duplicates
DataFu在枚举中有一个错误,修正了0.0.9,所以使用0.0.9或更高版本。
如果您的ID是数字,并且您不能使用UUID或其他基于字符串的ID。 LinkedIn提供了一个UDF的DataFu库( DataFu )有一个非常有用的UDF 枚举 。所以你可以做的是将所有记录分组到一个包中并将包传递给枚举。这是我头顶的代码:
register jar with UDF with Enumerate UDF inpt = load '....' ....; allGrp = group inpt all; withIds = foreach allGrp generate flatten(Enumerate(inpt));
您的行中有什么独特之处?看来您的帐户ID和国家/地区代码是您在Pig脚本中分组的内容,那么为什么不制作一个复合键呢?就像是
CONCAT(CONCAT(account, '-'), country)
当然,你可以编写一个UDF来使它更优雅。如果你需要一个数字ID,尝试编写一个UDF,它将创建如上所述的字符串,然后调用它 hashCode() 方法。这当然不能保证唯一性,但是你说没关系。您始终可以构建自己的将字符串转换为唯一的整数的方法。
hashCode()
但那说,为什么你需要一个ID密钥?如果您想稍后加入两个表的字段,则可以一次加入多个字段。