from mrjob.job import job
class KittyJob(MRJob):
OUTPUT_PROTOCOL = JSONValueProtocol
def mapper_cmd(self):
return "grep kitty"
def reducer(self, key, values):
yield None, sum(1 for _ in values)
if __name__ == '__main__':
KittyJob().run()
来源:https://mrjob.readthedocs.org/en/latest/guides/writing-mrjobs.html#protocols
这段代码是如何完成计算包含kitty的行数的任务的?
OUTPUT_PROTOCOL在哪里定义?
好吧,简短的回答是,这个例子不计算包含'kitty'的行。
下面是一些使用过滤器的代码,对包含(不区分大小写)kitty的行进行计数:
from mrjob.job import MRJob
from mrjob.protocol import JSONValueProtocol
from mrjob.step import MRStep
class KittyJob(MRJob):
OUTPUT_PROTOCOL = JSONValueProtocol
def mapper(self, _, line):
yield 'kitty', 1
def sum_kitties(self, key, values):
yield None, sum(values)
def steps(self):
return [
MRStep(mapper_pre_filter='grep -i "kitty"',
mapper=self.mapper,
reducer=self.sum_kitties)]
if __name__ == '__main__':
KittyJob().run()
如果我使用Shell命令中提到的本地运行程序在英文维基百科页面的"Kitty"文本上运行它,那么我将得到包含"Kitty"的所有行数:
$ python grep_kitty.py -q -r local kitty.txt
20
$ grep -ci kitty kitty.txt
20
看起来你从mrjob文档中引用的例子是错误的