2013-11-23 3 views
1

Это реализация MRJob простой функции сортировки Map-Reduce. В beta.py:Map-Reduce/Hadoop сортировать по целочисленному значению (используя MRJob)

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 

Теперь вопрос выход сортируется при условии, что ключ типа string (что, вероятно, имеет место здесь). Выход:

"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 (Solution): У меня есть ответ для этого. Идея состоит в том, что нужно доводить «О-байты» до каждого числа, чтобы количество байтов в каждом номере было таким же числом байтов в наибольшем числе. По крайней мере, это то, что я помню из своих занятий. Я не могу добавить ответ прямо сейчас, поскольку он не позволит мне, но это единственное решение, которое у меня есть. Если у кого-то есть что-то более прозрачное и легкое, пожалуйста, поделитесь.

+0

Так что это один питон скрипт на самом деле создает задание MapReduce для всего кластера? Я обычно использую Hadoop Streaming, когда использую скрипт Python для записи карты. .. –

+0

Ну, я не уверен в этом, но да, это возможно. Это то, что позволяет «MRJob». Вы можете прочитать об этом здесь - http://pythonhosted.org/mrjob/. – p0lAris

ответ

2

Простое решение (более прочный может быть основан на настройке, как 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]) 

 Смежные вопросы

  • Нет связанных вопросов^_^