在此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/