복붙노트

[HADOOP] Map-Reduce / Hadoop을 정수 값으로 정렬 (MRJob 사용)

HADOOP

Map-Reduce / Hadoop을 정수 값으로 정렬 (MRJob 사용)

이것은 간단한 Map-Reduce 정렬 기능의 MRJob 구현입니다. beta.py :

from mrjob.job import MRJob

class Beta(MRJob):
    def mapper(self, _, line):
        """
        """
        l = line.split(' ')
        yield l[1], l[0]

    def reducer(self, key, val):
        yield key, [v for v in val][0]


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

텍스트를 사용하여 실행합니다.

1 1
2 4
3 8
4 2
4 7
5 5
6 10
7 11

하나는 다음을 사용하여 실행할 수 있습니다.

cat <filename> | python beta.py

이제 문제는 키가 유형 문자열이라고 가정하여 출력을 정렬하는 것입니다 (여기서는 그 중 하나입니다). 출력은 다음과 같습니다.

"1"     "1"
"10"    "6"
"11"    "7"
"2"     "4"
"4"     "2"
"5"     "5"
"7"     "4"
"8"     "3"

내가 원하는 출력은 다음과 같습니다.

"1"     "1"
"2"     "4"
"4"     "2"
"5"     "5"
"7"     "4"
"8"     "3"
"10"    "6"
"11"    "7"

이것이 MRJob의 프로토콜을 다루는 것과 관련이 있는지는 잘 모르겠다. 왜냐하면 프로토콜은 특정 업무와 단계별이 아니기 때문이다.

EDIT (솔루션) :이 답변을 얻었습니다. 아이디어는 모든 숫자의 바이트 수를 가장 큰 숫자의 바이트 수와 같도록 모든 숫자에 'O 바이트'를 추가해야한다는 것입니다. 적어도 그것이 내가 수업에서 기억했던 것입니다. 지금은 대답을 추가 할 수 없지만 지금은 해결할 수있는 유일한 솔루션입니다. 누구든지 좀 더 투명하고 쉽게 뭔가가 있다면 공유하십시오.

해결법

  1. ==============================

    1.간단한 솔루션 (Hadoop이 매퍼 출력을 정렬하는 방법을 튜닝하는 것이 더 강력 할 수 있음)

    간단한 솔루션 (Hadoop이 매퍼 출력을 정렬하는 방법을 튜닝하는 것이 더 강력 할 수 있음)

    class Beta(MRJob):
    
        def mapper (self, _, line):
            l = line.strip('\n').split()
            yield '%010d'%int(l[1]), l[0]
    
        def reducer(self, key, values):
            yield int(key),int(list(values)[0])
    
  2. from https://stackoverflow.com/questions/20156817/map-reduce-hadoop-sort-by-integer-value-using-mrjob by cc-by-sa and MIT license