Apache pig 在Pig中的多个字段上联接

Apache pig 在Pig中的多个字段上联接,apache-pig,Apache Pig,我正在学猪,不知道该怎么做。我的文件中存储了一系列有关聊天信息的元数据: 12345 13579 23456 24680 19350 20283 28394 20384 10384 29475 . . . 第一列是发送方的id,第二列是接收方的id。我想做的是计算男人向女人、男人向男人、女人向男人、女人向女人发送的信息数量。因此,我有另一个存储用户id和性别的文件: 12345 M 23456 F 34567 M 45678 M . . . 因此,Pig脚本的开头可能如下所示: messag

我正在学猪,不知道该怎么做。我的文件中存储了一系列有关聊天信息的元数据:

12345 13579
23456 24680
19350 20283
28394 20384
10384 29475
.
.
.
第一列是发送方的id,第二列是接收方的id。我想做的是计算男人向女人、男人向男人、女人向男人、女人向女人发送的信息数量。因此,我有另一个存储用户id和性别的文件:

12345 M
23456 F
34567 M
45678 M
.
.
.
因此,Pig脚本的开头可能如下所示:

messages = load 'messages.txt' as (from:int, to:int);
users = load 'users.txt' as (id:int,sex:chararray);
从那以后,我真的不确定下一步该怎么做。我能够在向用户发送消息时一次连接一列,但不确定如何连接两列,然后进行后续分组


任何建议/提示都会非常有用。

我想你想要的是加入团队,然后统计你的数据

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;

我没有测试它,但是像这样的东西应该可以工作

+1。为了清晰起见,我认为包含
用户
消息
的模式会很有帮助。另外,
生成$0.sender\u sex作为sender\u sex,
生成$0.receiver\u sex作为receiver\u sex,
只需
生成扁平化($0)
。不用担心+1对于@mr2ert的评论,尽管我认为0.10.x+版本上有FLATTEN,但我像他说的那样使用了FLATTEN,它起了作用。这真是太棒了。