hadoop - Pig - 如何只从列表中选择一些值(不仅仅是简单的不同)?

标签 hadoop tuples apache-pig

假设我有 intput_file.txt(user_id、event_code、event_date):

1,a,1
1,b,2
2,a,3
2,b,4
2,b,5
2,b,6
2,c,7
2,b,8

如你所见,user_id = 2,有这样的事件:abbbcb
我想要这样的结果:

1,{(a,1),(b,2)}
2,{(a,2),(b,6),(c,7),(b,8)}

所以当我们有几个事件时,使用相同的代码,我想只处理最后一个。

你能分享一些提示吗?

问候 帕维尔

最佳答案

您描述的主要内容是 GROUP BY 的作用。

在这种情况下:

B = GROUP A BY user_id;

通过 user_id 获取您的记录。您的数据现在将如下所示:

1,{(a,1),(b,2)}
2,{(a,2),(b,6),(c,7),(b,8)}

您说您只想要最后一个(我假设您指的是具有最大 event_date 的那个)。为此,您可以使用 ORDER BY 执行嵌套的 FOREACH 以按日期排序,然后使用 LIMIT 获取第一个。请注意,当存在关系时,这具有任意行为。

C = FOREACH B {                          
   DA = ORDER A BY event_date DESC;                
   DB = LIMIT DA 1;                         
   GENERATE FLATTEN(group), FLATTEN(DB.event_code), FLATTEN(DB.event_date);
}

您的数据现在应该如下所示:

1,b,2
2,b,8

另一种选择是使用 UDF 在 GROUP BY 给出的组上编写一些自定义行为:

B = GROUP A BY user_id;
C = FOREACH B GENERATE YourUDFThatYouBuilt(group, A);

在该 UDF 中,您可以编写任何您想要的自定义行为(在本例中返回具有最晚日期的元组)

关于hadoop - Pig - 如何只从列表中选择一些值(不仅仅是简单的不同)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21233266/

相关文章:

hadoop - 如何从 PIG.. 调用 perl 脚本?

hadoop - TOKENIZE关键字查询Pig

hadoop - 使用 Hadoop0.20.2 运行标准 "WordCount"程序时没有得到正确的输出

java - 使用 distcp 或 s3distcp 将文件从 S3 复制到 HDFS

python - 如何在本地测试 Map 和 Reduce 代码?

python - 嵌套列表列表到单个元组列表

regex - 如何在 pig 中使用正则表达式替换另一个表达式

hadoop - PrestoDB SELECT * from table-错误

python - 用户输入数字列表并在 Python 函数中使用它

python - 成对查找字符串中的所有括号 - Python 3