Hadoop 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代码,以便只需要处理数据尽可能少的次数,因为输入保持不变,所有的变化都是分组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会自动完成此优化。如果始终将分组应用
感谢您的帮助。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,非常有用!