我处理由movielensdata提供的数据集movie.dat。数据的前5行是
1:玩具总动员(1995):冒险|动画|儿童|喜剧|幻想
2:Jumanji(1995):冒险|儿童|幻想
3:Grumpier Old Men(1995):喜剧|浪漫片
4:等待呼气(1995):喜剧|戏剧|浪漫
5:新娘之父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))
对猪的查询是否有建议执行相同的任务? 预先感谢...
答案 0 :(得分:0)
TOKENIZE
和FLATTEN
可以在这里为您提供帮助。 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;