为hadoop/pig输出数据分配id

qaxu7uf2  于 2021-06-04  发布在  Hadoop
关注(0)|答案(4)|浏览(393)

我正在研究pig脚本,它对原始事务执行繁重的数据处理,并提出了各种事务模式。
假设其中一种模式是-查找一天内收到跨境交易的所有账户(包括交易总额和交易金额)。
我的预期输出应该是两个数据文件1)汇总数据像帐户a1收到50个事务从国家au。2) 原始事务-a1的所有超过50个事务。
我的pig脚本当前正在创建以下格式的输出数据源
帐户国家/地区totaltxns rawtransactions
a1 au 50[(txn1),(txn2),(txn3)…(txn50)]
a2 jp 30[(txn1),(txn2)…(txn30)]
现在的问题是,当我从hadoop系统中获取这些数据(到某个db)时,我想在我的汇总记录(a1,au,50)和所有50个原始事务(比如,将汇总记录的id 1用作所有50个相关txn的外键)之间建立链接。
我知道分布式hadoop不应该用于分配id,但是有没有什么选项可以让我分配非唯一的id(不需要是连续的)或者其他方式来链接这些数据?
edit(在使用来自datafu的enumerate之后)这里是pig脚本

register /UDF/datafu-0.0.8.jar
define Enumerate datafu.pig.bags.Enumerate('1');
data_txn = LOAD './txndata' USING PigStorage(',') AS (txnid:int, sndr_acct:int,sndr_cntry:chararray, rcvr_acct:int, rcvr_cntry:chararray);
data_txn1 = GROUP data_txn ALL;
data_txn2 = FOREACH data_txn1 GENERATE flatten(Enumerate(data_txn));
dump data_txn2;

运行完这个之后,我
error org.apache.pig.tools.pigstats.simplepigstats-错误2997:无法从备份错误中重新创建异常:datafu.pig.bags.enumerate.enumeratebag(enumerate)处的java.lang.nullpointerexception。java:89)在datafu.pig.bags.enumerate.accumulate(enumerate。java:104) ....

xcitsw88

xcitsw881#

您所在的行中有什么独特之处?在pig脚本中,帐户id和国家代码似乎是您分组的依据,所以为什么不使用它们来创建一个复合键呢?像这样的

CONCAT(CONCAT(account, '-'), country)

当然,您可以编写一个自定义项,使其更加优雅。如果您需要一个数字标识,请尝试编写一个自定义项,该自定义项将如上所述创建字符串,然后调用其 hashCode() 方法。当然,这并不能保证唯一性,但你说过这是可以的。您可以构造自己的方法,将字符串转换为唯一的整数。
但也就是说,为什么你需要一个单一的身份证密钥?如果以后要联接两个表的字段,可以一次联接多个字段。

f4t66c6m

f4t66c6m2#

我经常在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

9fkzdhlc

9fkzdhlc3#

如果您的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));
kh212irz

kh212irz4#

datafu在enumerate中有一个bug,在0.0.9中修复了这个bug,所以使用0.0.9或更高版本。

相关问题