首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为hadoop/PIG输出数据分配ID

为hadoop/PIG输出数据分配ID
EN

Stack Overflow用户
提问于 2013-01-24 21:38:33
回答 4查看 1.8K关注 0票数 1

我正在编写猪脚本,它对原始事务执行繁重的数据处理,并提出了各种事务模式。

假设模式之一是-查找所有在一天内收到跨境交易的帐户(包括总交易额和交易额)。

我的预期输出应该是两个数据文件,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脚本

代码语言:javascript
复制
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重新创建异常。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-01-24 22:27:37

我经常在Hadoop作业中分配随机in。您只需要确保生成包含足够数量的随机位的is,以确保碰撞的概率足够小(问题)。

作为经验法则,我使用3*log(n)随机位,其中n=#需要生成的ids。

在许多情况下,Java的UUID.randomUUID()就足够了。

复本

票数 0
EN

Stack Overflow用户

发布于 2013-01-24 22:09:48

在你的行中什么是独一无二的?帐户ID和国家代码似乎是你在你的猪脚本中分组的代码,那么为什么不用这些来创建一个复合密钥呢?有点像

代码语言:javascript
复制
CONCAT(CONCAT(account, '-'), country)

当然,您可以编写一个UDF来使它更优雅。如果您需要一个数字ID,请尝试编写一个UDF,它将创建上面的字符串,然后调用它的hashCode()方法。这当然不能保证独特性,但你说没关系。您始终可以构造自己的方法,将字符串转换为唯一的整数。

但话虽如此,为什么你需要一个单一的ID键呢?如果希望在以后加入两个表的字段,则可以一次连接多个字段。

票数 0
EN

Stack Overflow用户

发布于 2013-01-25 00:12:19

如果您的ID是数字,您不能使用UUID或其他基于字符串的ID。有一个由LinkedIn (DataFu)提供的UDF库,其中包含一个非常有用的UDF 枚举。所以,您可以做的是将所有记录分组到一个袋子中,并将该袋子传递给枚举。下面是我头顶上的代码:

代码语言:javascript
复制
register jar with UDF with Enumerate UDF
inpt = load '....' ....;
allGrp = group inpt all;
withIds = foreach allGrp generate flatten(Enumerate(inpt));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14511271

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档