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定义在哪里?
答案 0 :(得分:1)
嗯,简短的回答是,这个例子并不计算包含' 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 Commands as Steps中所述的本地跑步者在' Kitty'的英文维基百科页面上运行它,那么我会计算所有包含'小猫'正如所料:
$ python grep_kitty.py -q -r local kitty.txt
20
$ grep -ci kitty kitty.txt
20
看起来你从mrjob docs中引用的例子是错误的。