我是apache pig的新手,希望通过编写pig脚本实现自底向上的立方体处理。然而,这需要我以层次的方式进行分组。
例如,如果我的数据是(交易所,符号,日期,股息)的形式,其中股息是一个度量,其余是维度,我想首先按交易所分组数据并打印总股息,然后进一步按交易所和符号等等。
一种方法是在脚本中编写所有可能的分组,例如按交换分组、按符号分组、按(交换、符号)分组等。然而,这似乎不是最理想的。是否有一种方法(例如)首先按交换分组,然后为每个交换组,内部按符号分组,以生成(exchange)和(exchange,symbol)的聚合,因为这将更有效。这里讨论了类似的东西,但它没有回答我的问题:我可以在Pig Latin中使用嵌套FOREACH语句生成嵌套包吗?谢谢!
这完全取决于你对"最优"的定义。你的直觉是,如果你先按(交换,符号,股利)进行细粒度分组,然后把结果分组到(交换,符号),那么得到(交换)的结果是正确的,因为你会做更少的算术运算。然而,你的map-reduce流程显然不是最优的。这将需要3个map-reduce作业,每个输出提供下一个输入。
如果每个分组都独立进行,则只需要一个map-reduce作业。映射器将为每个分组发出键值对,reducer将分别处理每种类型的聚合。一个map-reduce作业意味着更少的字节读写磁盘,更少的时间花费在设置和拆除Hadoop作业上。除非您正在执行一个计算非常密集的过程(计算平均值肯定不是),否则这些因素,特别是磁盘I/O,是决定作业所需时间的最重要的考虑因素。