PIG - 从一个大输入优化各种分组结构的最佳方法
Posted
技术标签:
【中文标题】PIG - 从一个大输入优化各种分组结构的最佳方法【英文标题】:PIG - Best way to optimize various grouping structures from one large input 【发布时间】:2013-06-20 19:29:14 【问题描述】:我正在使用 Pig 获取表单的一个大 txt 文件
Col A |上校 B |上校 C |科尔D |上校 |上校 F |科尔G
我的目标是获取这些输入并按列的各种组合进行分组以获得类似的结果
(A 列 / 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)
我想知道是否有办法构建我的猪代码,以便只需要尽可能少地处理数据,因为输入保持不变,而改变的只是分组。
提前致谢。
【问题讨论】:
【参考方案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);
【讨论】:
嘿,感谢您迄今为止提供的信息,这是有道理的,但实际上我们对不同的分组做不同的事情,所以我想我不会使用宏。还有一件事,就是说我们有关系 W,X,Y,Z,我们需要存储每一个。如果每个存储命令都有单独的行,这不是最优的吗?我的意思是每次我调用命令“存储”时,它是否必须重新加载数据,创建分组和最终关系,然后存储数据,或者猪是否知道加载数据一次,创建分组和关系,然后去商店。 不,Pig 会处理得很好。如果您在 Grunt shell 中键入命令,那么每次您输入STORE
命令时,它都会执行整个脚本。但是,如果您将脚本放在使用 Pig 运行的文件中,则数据只会加载一次。
谢谢你winnienicklaus,非常有帮助!以上是关于PIG - 从一个大输入优化各种分组结构的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章
如何优化 PIG latin 中的 group by 语句?