hadoop - PIG-基于多列的聚合

标签 hadoop apache-pig

我的输入数据集有3列,架构如下所示:

ActivityDate,EventId,EventDate

现在,使用Pig我需要在一个输出文件中派生如下所示的多个变量:

1)ActivityDate> = EventDate -30天后的所有事件ID
2)ActivityDate> = EventDate -60天后的所有事件ID
3)ActivityDate> = EventDate -90天之后的所有事件ID

我有30多个这样的变量。如果它是一个变量,我们可以使用简单的FILTER来过滤数据。

我正在考虑任何将包作为输入并根据上述每个参数的标准返回事件ID的UDF实现。

汇总Pig中多列数据的最佳方法是什么?

最佳答案

我建议您使用所有阈值创建另一个文件,然后与该文件交叉连接。
因此您将拥有一个包含以下内容的文件:

30
60
90

等等

像这样阅读:
grouping = load 'grouping.txt' using PigStorage(',') as (groups:double);

然后做:
data_with_grouping = cross data, grouping;

然后具有以下二进制条件:
data_with_binary_condition = foreach data_with_grouping generate ActivityDate, EventId, EventDate, groups, (ActivityDate >= EventDate - groups ? 1 : 0) as binary_condition;

现在,您将拥有一列带有阈值的列,以及一列带有二进制变量的列,该变量告诉您​​ID是否符合条件。

您可以从binary_condition过滤掉所有零,然后在groups列中进行分组:
data_with_binary_condition_filtered = filter data_with_binary_condition by (binary_condition != 0);
grouped_by_threshold = group data_with_binary_condition_filtered by groups;
count_of_IDS = foreach grouped_by_threshold generate group, COUNT(data_with_binary_condition.EventId);

我希望这行得通。显然,由于没有文件,因此我没有为您调试它。
该代码将花费更多的时间来运行,但是它将在没有UDF的情况下产生您需要的输出。

关于hadoop - PIG-基于多列的聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25611457/

相关文章:

apache-pig - 拉丁 pig 包在分组后进行元组

hadoop - 当对多个输入文件完成 mapreduce 任务时,hadoop 如何确定映射器或输入拆分的数量?

maven - 在 tomcat-server 中部署时与应用程序的依赖关系问题

macos - Hadoop Namenode格式在Mac上失败

hadoop - pig 的分组和平均值

hadoop - 如何向从 Pig (Hadoop) 创建的文件添加标题行?

hadoop - 关于在Oozie中运行的作业失败

hadoop 的数据节点没有启动

apache-pig - pig 群中的简单 AVG?

hadoop - 可以用php脚本写hadoop pig的UDF吗?