我正在使用Pig来获取一个格式为
的大文本文件Col A | Col B | Col C | Col D | Col E | Col F | Col G
我的目标是通过列的各种组合来获取此输入和分组以获得类似这样的内容
(Col A / Col B)|伯爵(Col F)|总和(Col G)
(Col A / Col C)|伯爵(Col F)|总和(Col G)
(Col A / Col D)|伯爵(Col F)|总和(Col G)
(Col B / Col C)|伯爵(Col F)|总和(Col G)
我想知道是否有办法构建我的猪代码,以便只需要处理数据的次数尽可能少,因为输入保持不变,所有改变的都是分组。
先谢谢。
答案 0 :(得分:1)
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);