2014-01-07 50 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