Hadoop Pig:计算分组列的出现次数

Hadoop Pig:计算分组列的出现次数,hadoop,apache-pig,Hadoop,Apache Pig,在这里,我们有棒球运动员的信息,模式是: name:chararray, team:chararray, position:bag{t:(p:chararray)}, bat:map[] 使用下面的脚本,我们可以列出球员和他们踢过的不同位置。我们如何计算有多少球员打过一个特定的位置? 例如,有多少名球员处于“指定击球手”位置 对于一个玩家来说,一个位置不能在位置包中多次出现 示例数据的Pig脚本和输出如下所示 --pig script players = load 'baseball' as

在这里,我们有棒球运动员的信息,模式是:

name:chararray, team:chararray, position:bag{t:(p:chararray)}, bat:map[]
使用下面的脚本,我们可以列出球员和他们踢过的不同位置。我们如何计算有多少球员打过一个特定的位置? 例如,有多少名球员处于“指定击球手”位置

对于一个玩家来说,一个位置不能在
位置
包中多次出现

示例数据的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)})

您可以使用嵌套的DISTINCT获取玩家列表,然后对其进行计数

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;
pos_count = foreach groupbyposition generate {
     players = DISTINCT name;
     generate group, COUNT(players) as num, pos;
}

据我所知,你已经完成了所有的“咕噜”(哈!猪笑话)工作。剩下要做的就是在
分组依据的输出上使用
。比如:

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

注意:使用UDF,您可能会得到更有效的解决方案。如果您关心计算某些字段,那么在手前过滤
位置
包应该更有效(这就是为什么我说UDF,我忘了您可以使用嵌套的
过滤器
)。例如:

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) ;
}
如果您想要的位置中没有一个出现在
position
中,那么它将创建一个空包。当空行李被展平时,该行被丢弃。这意味着您将
展平
由N个或更少的元素组成的包(其中N是您想要的字段数),而不是7-15个元素(没有仔细查看数据),并且
将使用更少的数据


注意:我不确定这是否会显著加快(如果有的话)。此外,使用UDF预成型嵌套的
过滤器
可能更快

foreach groupbyposition是否应该生成:
be
foreach groupbyposition{
?还有,为什么在这里使用
DISTINCT
?如果玩家多次列出相同的位置,那么一个名字只能在
groupby
的输出中出现两次(我认为这不会发生)。感谢:这是一个输入错误。袋子允许重复,我们不知道带位置的袋子是如何创建的。在更正foreach输入错误后,上面的代码引发了以下错误:错误1200:Pig脚本无法解析:无效的标量投影:玩家:需要从关系投影一列才能用作scalarTry“players=不同的位置名称你能提供UDF在这种情况下更有效的原因吗?@alexeipab正如我在对你的回答的评论中所暗示的那样,我假设这些位置不能出现多次。它们只是一个布尔值,“这个玩家玩过这个位置吗?”假设你不需要
不同的
。谢谢上面的说明代码运行正常,它正确地列出了在特定位置上玩过的玩家的数量。@SwiftGuy一个位置可以在位置袋中出现多次吗?如果可以,那么alexeipab的回答是正确的(减去当前语法错误)。@mr2ert position不会在位置袋中出现多次。