2016-02-21 2 views
-1

Я пытаюсь изучить немного mapreduce в сочетании с Python.Выполнение функции mapreduce в Python

Теперь у меня есть следующий код, выполняемый из учебника, который я делаю.

from mrjob.job import MRJob 

class SpendByCustomer(MRJob): 

    def mapper(self, _, line): 
     (customerID, itemID, orderAmount) = line.split(',') 
     yield customerID, float(orderAmount) 

    def reducer(self, customerID, orders): 
     yield customerID, sum(orders) 


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

Он должен сделать следующее.

Когда я ударил !python SpendByCustomers.py customer-orders.xls > test.txt он должен прочитать в .xls файл, карта и уменьшить его и записать вывод test.txt.

Все работает нормально, и я в основном это понимаю. Тем не менее, я действительно хотел бы получить больше понимания о следующем:

  • В

    def mapper(self, _, line): 
    

    Что такое _ здесь делает?

  • В

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

    Что эта функция делает именно?

+0

Основная часть вашего 'названия == 'вашего вопроса - это четкий дубликат. Вы пытались его исследовать? См. Это: http://stackoverflow.com/a/419185/4996248 –

ответ

0

В

def mapper(self, _, line): 

Что такое _ здесь делает?

MRJob.mapper имеет сигнатуру метода MRJob.mapper(key, value)

Если переопределить его в производном классе (как вы делаете), вы должны держать совместимую подпись, так что вы должны принимать два аргумента. Ваша функция будет вызываться с некоторым ключом в качестве первого аргумента, а некоторое значение - вторым аргументом. В документации указано, что «если вы не испортите протоколы», ключ, с которым вы будете звонить, будет None, поэтому это не особенно интересно. Следовательно, ваше переопределение метода ничего не делает с этим.

В Python принято использовать имя _ для аргументов, которые необходимо иметь в сигнатуре, чтобы оставаться совместимыми с интерфейсами. Технически нет ничего особенного в этом аргументе. Это просто односимвольное имя, используя один из символов, разрешенных для идентификаторов. Он выбирается главным образом для его визуального внешнего вида (выглядящего как незаполненное из поля), чтобы рассказать читателям о вашем коде: я получаю здесь значение, но мне все равно, что это (и не будет использовать его в моя реализация).

В

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

Что эта функция делает именно?

Для if __name__ == '__main__': части см What does if __name__ == "__main__": do?

для .run() части, обратитесь к MRJob documentation.

2

В письмах Python цифры и символы подчеркивания могут использоваться для имен переменных. (Имя переменной не может начало с цифрой.) Подчеркивание является обычно используемым именем переменной для значений, которые не будут использоваться. Например, если я хотел напечатать «привет» в 5 раз, я мог бы сделать следующее:

for _ in range(5): 
    print("hello") 

В этом примере _ это ничего не делает; он существует, потому что мы должны поместить там какое-то имя переменной, но используя , имя переменной - это сообщение другим программистам, которые смотрят на код, который эта переменная не будет использоваться. В случае функции это связано с тем, что метод mapper обычно вызывается с тремя аргументами, но в вашем методе mapper этот параметр не используется. Что касается второго вопроса, то SpendByCustomer.run() - это метод, определенный в классе mrjob.job.MRJob. Как вы могли догадаться от его имени, он запускает задание MapReduce. Он использует ваш метод mapper() и ваш метод reducer() для этого.