2014-01-07 52 views
0

我正在学习猪,不知道如何做到以下几点。我有文件存储了关于聊天消息系列元数据:加入猪的多个领域

12345 13579 
23456 24680 
19350 20283 
28394 20384 
10384 29475 
. 
. 
. 

第一列是发送者的ID和第2栏是接收器的标识。我想要做的是计算从男人到女人,男人到男人,女人到男人,从女人到女人发送的邮件数量。所以我有一个存储用户ID和性别另一个文件:

12345 M 
23456 F 
34567 M 
45678 M 
. 
. 
. 

所以猪脚本可能开始列如下:

messages = load 'messages.txt' as (from:int, to:int); 
users = load 'users.txt' as (id:int,sex:chararray); 

从那里,我真的不知道下一步要采取应该。我能够在一次向用户发送消息时加入一列,但不知道如何加入两列,然后执行后续分组。

任何建议/提示将是超级有用的。

回答

1

我想你想要的是加入,然后组和计数你的数据。

joinedSenderRaw = JOIN users BY id, messages BY from; 

joinedSender = FOREACH joinedSenderRaw 
    GENERATE messages::from as sender_id, 
      users::sex as sender_sex, 
      messages::to as receiver_id; 

joinedAllRaw = JOIN joinedSender BY receiver_id, users BY id; 

joinedAll = FOREACH joinedAllRaw 
    GENERATE joinedSender::sender_id, 
      joinedSender::sender_sex, 
      joinedSender::receiver_id, 
      users::sex as receiver_sex; 

grouped = GROUP joinedAll BY (sender_sex, receiver_sex); 

result = FOREACH grouped 
    GENERATE $0.sender_sex AS sender_sex, 
      $0.receiver_sex AS receiver_sex, 
      COUNT($1) AS your_stat; 

我没有测试它,但这样的事情应该工作。

+0

+1。为了清楚起见,我认为将'users'和'messages'的模式包含在内是有帮助的。此外,'生成$ 0.sender_sex AS sender_sex,$ 0.receiver_sex AS receiver_sex''可以是'GENERATE FLATTEN($ 0)'。 – mr2ert

+0

它的工作!这两个连接是有意义的。非常感谢。 –

+0

不用担心! +1对@ mr2ert的评论,尽管FLATTEN在版本0.10.x +我认为是可用的。 – kevad