我是apache pig的新手,希望通过编写一个pig脚本来实现自下而上的立方体。然而,这需要我以分层的方式进行分组。
例如,如果我的数据的形式是( exchange,symbol,date,dividend),其中dividend是一个度量,其余的是维度,我想首先通过交换和打印汇总红利来分组数据,然后再通过交换和符号进行分组,依此类推。
要做到这一点,一种方法是在脚本中编写所有可能的分组,例如group by exchange、group by symbol、group by (exchange,symbol)等。然而,这似乎并不是最优的。是否有一种方法(例如)首先按交换分组,然后在内部按符号分组为每个交换组生成(交换)的聚合,然后为(交换,符号)生成聚合,因为这样会更有效率。
这里讨论了一些类似的东西,但它没有回答我的问题:Can I generate nested bags using nested FOREACH statements in Pig Latin?,谢谢!
发布于 2013-06-08 13:35:26
这完全取决于你对“最佳”的定义。你的直觉是,如果你首先按(交换,符号,被除数)进行粒度分组,然后将结果分组以获得(交换,符号),那么通过(交换)获得的结果是正确的,因为你将进行更少的算术运算。但是,您的map-reduce流显然不是最优的。这将需要3个map-reduce作业,每个输出提供下一个输入。
如果每个分组都是单独进行的,那么只需要一个map-reduce作业。映射器将为每个分组发出键值对,而reducer将分别处理每种类型的聚合。一个map-reduce作业意味着从磁盘读取和写入磁盘的字节数更少,设置和拆卸Hadoop作业所花费的时间也更少。除非您正在进行一个计算非常密集的过程(而计算平均值肯定不是),否则这些因素,特别是磁盘I/O,是作业将需要多长时间的最重要的考虑因素。
https://stackoverflow.com/questions/16977028
复制