Hadoop PIG-从一个大输入优化各种分组结构的最佳方法

Hadoop PIG-从一个大输入优化各种分组结构的最佳方法,hadoop,apache-pig,Hadoop,Apache Pig,我用猪采取一个大的txt文件的形式 A列| B列| C列| D列| E列| F列| G列 我的目标是通过各种列的组合来获取这些输入和分组,以获得类似的结果 (A列/B列)|计数(F列)|总和(G列) (A列/C列)|计数(F列)|总和(G列) (A列/D列)|计数(F列)|总和(G列) (B列/C列)|计数(F列)|总和(G列) 我想知道是否有方法来构造我的pig代码,以便只需要处理数据尽可能少的次数,因为输入保持不变,所有的变化都是分组 感谢您的帮助。Pig会自动完成此优化。如果始终将分组应用

我用猪采取一个大的txt文件的形式

A列| B列| C列| D列| E列| F列| G列

我的目标是通过各种列的组合来获取这些输入和分组,以获得类似的结果

(A列/B列)|计数(F列)|总和(G列)

(A列/C列)|计数(F列)|总和(G列)

(A列/D列)|计数(F列)|总和(G列)

(B列/C列)|计数(F列)|总和(G列)

我想知道是否有方法来构造我的pig代码,以便只需要处理数据尽可能少的次数,因为输入保持不变,所有的变化都是分组


感谢您的帮助。

Pig会自动完成此优化。如果始终将分组应用于原始数据,则所有分组都可以并行进行,并将在单个map reduce作业中执行

考虑到您希望对每个分组执行相同的操作,您应该定义一个宏,这样您就可以节省一些输入。例如:

DEFINE DO_STUFF(input, grp1, grp2) RETURNS result {
    grouped = GROUP $input BY ($grp1, $grp2);
    $result = FOREACH grouped GENERATE FLATTEN(group), COUNT(grouped.F), SUM(grouped.G);
};

data = LOAD '/path/to/txt' AS (A, B, C, D, E, F, G:int);
W = DO_STUFF(data, A, B);
X = DO_STUFF(data, A, C);
Y = DO_STUFF(data, A, D);
Z = DO_STUFF(data, B, C);

嘿,谢谢你提供的信息,这是有道理的,但实际上我们对不同的分组做了不同的事情,所以我想我不会使用宏。还有一件事,假设我们有关系W,X,Y,Z,我们需要存储每个关系。如果每个store命令都有单独的行,这不是最优的吗?我的意思是,每当我调用命令“store”时,它是否必须重新加载数据,创建分组和最终关系,然后存储数据,或者pig是否知道加载数据一次,创建分组和关系,然后点击存储。不,pig会处理这一问题。如果在Grunt shell中键入命令,那么每次输入
STORE
命令时,它都会执行整个脚本。但是,如果您在使用Pig运行的文件中有脚本,那么数据将只加载一次。谢谢winnienicklaus,非常有用!