считая жанры у свиньи - PullRequest
1 голос
/ 29 марта 2019

Я имею дело с набором данных movies.dat, предоставленным movielensdata.Первые 5 строк данных:

1: История игрушек (1995): Приключения | Анимация | Дети | Комедии | Фэнтези
2: Джуманджи (1995): Приключения | Дети | Фэнтези
3:Grumpier Old Men (1995): Комедия | Романтика
4: В ожидании выдоха (1995): Комедия | Драма | Романтика
5: Отец невесты Часть II (1995): Комедия

Iхочу посчитать точное количество вхождений каждого жанра.Для этого достаточно следующего кода 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)) 

Есть ли какие-нибудь предложения для запроса свиньи выполнить ту же задачу?Заранее спасибо ...

1 Ответ

0 голосов
/ 29 марта 2019

TOKENIZE и FLATTEN могут помочь вам здесь.Оператор TOKENIZE в Pig берет строку и разделитель, разбивает строку на части в соответствии с разделителем и складывает детали в пакет.Оператор FLATTEN в Pig берет сумку и взрывает каждый элемент в сумке в новую запись.Код будет выглядеть следующим образом:

--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;
...