计数猪的流派

counting genres in pig

我处理的是movielensdata提供的数据集movies.dat。前5行数据为

1:玩具总动员 (1995):冒险|动画|儿童|喜剧|奇幻
2:Jumanji (1995):冒险|儿童|奇幻
3:Grumpier 老男人 (1995):喜剧|爱情
4:Waiting 呼气 (1995):喜剧|剧情|爱情
5:Father of the Bride Part II (1995):喜剧

我想计算每种类型出现的确切次数。为此,以下 mapreduce (python) 代码就足够了。

#!/usr/bin/env python

import sys

#mapper

for line in sys.stdin:
    for genre in line.strip().split(":")[-1].split("|"):
        print("{x}\t1".format(x=genre))

#!/usr/bin/env python                                                                                                                                                   
#reducer
import sys                                                                                                                                                              

genre_dict={}                                                                                                                                                           
for line in sys.stdin:                                                                                                                                                  
    data=line.strip().split("\t")                                                                                                                                       
    if len(data)!=2:                                                                                                                                                    
        continue                                                                                                                                                        
    else:                                                                                                                                                               
        if data[0] not in genre_dict.keys():                                                                                                                            
            genre_dict[data[0]]=1                                                                                                                                       
        else:                                                                                                                                                           
            genre_dict[data[0]]+=1                                                                                                                                      

a=list(genre_dict.items())                                                                                                                                              
a.sort(key=lambda x:x[1],reverse=True)                                                                                                                                  

for genre,count in a:                                                                                                                                                   
    print("{x}\t{y}".format(x=genre,y=count)) 

对猪的查询做同样的任务有什么建议吗? 提前致谢...

TOKENIZEFLATTEN 可以帮助您。 Pig 中的 TOKENIZE 运算符接受一个字符串和一个分隔符,根据分隔符将字符串拆分为多个部分,并将这些部分放入一个包中。 Pig 中的 FLATTEN 运算符取一个包并将包中的每个元素分解为一条新记录。代码如下所示:

--Load you initial data and split into columns based on ':'
data = LOAD 'path_to_data' USING PigStorage(':') AS (index:long, name:chararray, genres:chararray);

--Split & Explode each individual genre into a separate record
dataExploded = FOREACH data GENERATE FLATTEN(TOKENIZE(genres, '|')) AS genre;

--GROUP and get counts for each genre
dataWithCounts = FOREACH (GROUP dataExploded BY genre) GENERATE
              group AS genre,
              COUNT(dataExploded) AS genreCount;

DUMP dataWithCounts;