我正在编写猪脚本,它对原始事务执行繁重的数据处理,并提出了各种事务模式。
假设模式之一是-查找所有在一天内收到跨境交易的帐户(包括总交易额和交易额)。
我的预期输出应该是两个数据文件,1)汇总类数据帐户A1从国家AU接收了50个事务。( 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个相关Txns的外键)。
我知道分发的Hadoop不应该用于分配i,但是有什么选项可以分配非唯一的i(不需要顺序)或者其他链接数据的方法吗?
编辑(在使用DataFu枚举之后)这里是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;在运行完这个之后,我要
错误(错误)-错误2997:无法从后台错误: datafu.pig.bags.Enumerate.enumerateBag(Enumerate.java:89) at datafu.pig.bags.Enumerate.accumulate(Enumerate.java:104) . java.lang.NullPointerException重新创建异常。
发布于 2013-01-24 22:27:37
我经常在Hadoop作业中分配随机in。您只需要确保生成包含足够数量的随机位的is,以确保碰撞的概率足够小(问题)。
作为经验法则,我使用3*log(n)随机位,其中n=#需要生成的ids。
在许多情况下,Java的UUID.randomUUID()就足够了。
复本
发布于 2013-01-24 22:09:48
在你的行中什么是独一无二的?帐户ID和国家代码似乎是你在你的猪脚本中分组的代码,那么为什么不用这些来创建一个复合密钥呢?有点像
CONCAT(CONCAT(account, '-'), country)当然,您可以编写一个UDF来使它更优雅。如果您需要一个数字ID,请尝试编写一个UDF,它将创建上面的字符串,然后调用它的hashCode()方法。这当然不能保证独特性,但你说没关系。您始终可以构造自己的方法,将字符串转换为唯一的整数。
但话虽如此,为什么你需要一个单一的ID键呢?如果希望在以后加入两个表的字段,则可以一次连接多个字段。
发布于 2013-01-25 00:12:19
https://stackoverflow.com/questions/14511271
复制相似问题