在此raw data中,我们有棒球选手的信息,其架构为:

name:chararray, team:chararray, position:bag{t:(p:chararray)}, bat:map[]

使用以下脚本,我们可以列出玩家及其所扮演的不同位置。我们如何计算有多少位玩家担任过特定职位?
例如。有多少位玩家处于“Designated_hitter”位置?

一个玩家的位置不能在position包中多次出现。

下面列出了Pig脚本和示例数据的输出。
--pig script
players = load 'baseball' as (name:chararray, team:chararray,position:bag{t:(p:chararray)}, bat:map[]);
pos     = foreach players generate name, flatten(position) as position;
groupbyposition = group pos by position;dump groupbyposition;

--dump groupbyposition (output of one position i.e Designated_hitter)
(Designated_hitter,{(Michael Young,Designated_hitter)})

最佳答案

据我所知,您已经完成了所有的“讨厌”(哈!, pig Jest )工作。剩下要做的就是在COUNT的输出上使用 GROUP BY 。就像是:

groupbyposition = group pos by position ;
pos_count = FOREACH groupbyposition GENERATE group AS position, COUNT(pos) ;

注意:使用UDF,您可能可以获得更有效的解决方案。如果您关心计数某些字段,那么事前过滤postion包应该会更有效率(这就是为什么我说UDF的原因,我忘记了您只能使用嵌套的FILTER)。例如:
pos = FOREACH players {
              -- you can also add the DISTINCT that alexeipab points out here
              -- make sure to change postion in the FILTER to dist!
              -- dist = DISTINCT position ;
              filt = FILTER postion BY p MATCHES 'Designated_hitter|etc.' ;
      GENERATE name, FLATTEN(filt) ;
}

如果您想要的职位都没有出现在postion中,那么它将创建一个空袋子。当空袋用FLATTEN编码时,该行将被丢弃。这意味着您将对N个或更少元素(其中N是您想要的字段数)而不是7-15个(实际上并没有仔细查看数据)进行FLATTEN袋,并且GROUP将显着打开较少的数据。

注意:我不确定这是否会更快(如果有的话)。同样,使用UDF执行嵌套的FILTER可能会更快。

关于hadoop - pig :计算分组列的出现,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18893927/

10-16 05:30