MapReduce:如何跟踪映射器中多行的状态(比如计算三元组)?

时间:2014-03-03 03:36:39

标签: python mapreduce mrjob

我正在尝试使用Python中的mrjob框架编写用于计算Trigrams的MapReduce程序。到目前为止,这就是我所拥有的:

from mrjob.job import MRJob

class MRTrigram(MRJob):

    def mapper(self, _, line):
        w = line.split()
        for idx,word in enumerate(w):
            if idx < len(w) - 2:
                # Generate a trigram using the current word and next 2 words
                trigram = w[idx] + " " + w[idx + 1] + " " + w[idx + 2]
                yield trigram, 1

    def reducer(self, key, values):
        yield sum(values), key

# ignore this part - its just standard bolierplate for mrjob!
if __name__ == '__main__':
    MRTrigram.run()

正如可以看到的那样,我没有处理过三行分裂的情况(例如,“它是”在第3行的末尾,“最好的时候”在第4行的开头 - 但是我的代码不会捕获三元组“在这种情况下它就是”!)。

如何在多个地图调用中保留状态,确保无论映射器是否由基础运行时分配作业,只计算连续行中的三元组?我想在MRTrigram类中的持久数据结构中存储每行的最后2个单词,但后来我意识到我无法保证我是否在比较i和i + 1行之间的单词(而不是行i,j,其中j可以在文档中的任何位置排成行!)。

有什么想法让我走上正轨吗?

1 个答案:

答案 0 :(得分:0)

您可能会得到writing a custom protocol如何完成此操作的提示,但我相信mrjob会在添加自定义行为(即,形成键和值)之前使用新行字符分隔的流输入,所以mrjob可能无法实现。

如果您正在使用Hadoop(即本机Java),那么您可以编写一个自定义输入格式,该格式采用多行文本并从中解析键值对。