15강. MapReduce 연습 문제: 평점별로 영화 분류하기

→ 아까 다뤘던 예제에서, UserID대신에 Rating을 Key로 Mapping 하면 될 것으로 보임

분석을 위해 MapReduce를 사용할 때는 Mapper와 Reducer를 어떻게 구성해 원하는 결과를 도출할 것인지 고민해야 한다. MapReduce 방식으로 문제를 바라보는게 쉬운 작업은 아니라서, SQL 스타일 쿼리 기능을 제공하는 Spark, Hive 프레임워크가 인기있는 이유가 되기도 한다. (물론 Spark는 Map Reduce 스타일로 문제를 해결할 수도 있다!)

from mrjob.job import MRJob
from mrjob.step import MRStep

class RatingsBreakdown(MRJob):
    def steps(self):
        return [
            MRStep(mapper=self.mapper_get_ratings,
                   reducer=self.reducer_count_ratings)
        ]

    def mapper_get_ratings(self, _, line):
        (userID, movieID, rating, timestamp) = line.split('\\t')
        yield rating, 1

    def reducer_count_ratings(self, key, values):
        yield key, sum(values)

if __name__ == '__main__':
    RatingsBreakdown.run()

16강. MRJob을 설치할 때 주의할 점

17강에서 빠진 내용을 좀 더 커버해주는 내용. 설치해야하는건 여기만 따라해도 되긴 함.

17강. Python, MRJob, Nano 설치하기

2.6.5와 2.5.0이 진행하는 방식이 다르니 유의해서 진행.

닫힌 repo가 많아서 초반에 다 실패하다가 mysql57 레포에 이르러서야 진행됐음.

python은 2버전이 설치됨..

vim이 편한 관계로 nano는 따로 설치하지 않았음

18강. MapReduce 작업을 코딩하고 실행하기

from mrjob.job import MRJob
from mrjob.step import MRStep

class RatingsBreakdown(MRJob):
    def steps(self):
        return [
            MRStep(mapper=self.mapper_get_ratings,
                   reducer=self.reducer_count_ratings)
        ]

    def mapper_get_ratings(self, _, line):
        (userID, movieID, rating, timestamp) = line.split('\\t')
        yield rating, 1

    def reducer_count_ratings(self, key, values):
        yield key, sum(values)

if __name__ == '__main__':
    RatingsBreakdown.run()

Untitled

매우 유감스럽게도 뻗어버림.. ㅋㅋㅋ

19강. 인기순으로 영화 정렬하기

숙련자들에게는 추가 과제를 주심

→ 많이 평가받은 수대로 정렬해보세요. 현재 스크립트는 영화 ID 순으로 정렬되어 나오는데, 요건 영화가 평가된 횟수의 순서로 정렬해야함.

전략