【问题标题】:counting genres in pig计算猪的流派
【发布时间】:2019-03-29 12:35:28
【问题描述】:

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

1:玩具总动员 (1995):冒险|动画|儿童|喜剧|奇幻
2:勇敢者游戏(1995):冒险|儿童|奇幻
3:脾气暴躁的老人 (1995):喜剧|爱情
4:等待呼气 (1995):喜剧|戏剧|爱情
5:新娘之父第二部分(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)) 

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

【问题讨论】:

    标签: mapreduce apache-pig


    【解决方案1】:

    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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多