我是apachepig的新手,希望通过编写pig脚本来实现自底向上的cubing。然而,这需要我以一种分层的方式进行分组。
例如,如果我的数据是(exchange,symbol,date,divident)的形式,其中dividence是一个度量值,其余的是维度,那么我希望首先按exchange分组数据并打印合计的divident,然后再按exchange和symbol等等。
一种方法是在脚本中编写所有可能的分组,如按交换分组、按符号分组、按(交换、符号)分组等。但是,这似乎并不理想。是否有一种方法(例如)先按交换分组,然后对每个交换组内部按符号分组,以便为(交换)生成聚合,然后为(交换,符号)生成聚合,因为这样效率更高。
这里讨论了一些类似的问题,但没有回答我的问题:我可以使用pig拉丁语中的嵌套foreach语句生成嵌套包吗?谢谢!
1条答案
按热度按时间fwzugrvs1#
这完全取决于你对“最佳”的定义。你的直觉是,如果你先做一个粒度分组(exchange,symbol,divident),然后把结果分组到get by(exchange,symbol),那么get by(exchange)的结果是正确的,因为你会做更少的算术运算。然而,你的Map减少流量将明显次优。这将需要3个map reduce作业,每个输出为下一个输入提供输入。
如果独立地进行每个分组,则只需要一个map reduce作业。Map器将为每个分组发出键值对,而reducer将分别处理聚合每种类型。一个map reduce作业意味着从磁盘读取和写入的字节更少,设置和删除hadoop作业所花费的时间也更少。而且,除非您正在执行一个计算量非常大的过程(而计算平均值肯定不是),否则这些因素,尤其是磁盘i/o,是作业所需时间的最重要考虑因素。