【问题标题】:Getting maximum occurred word in Hadoop Mapreduce word count获取 Hadoop Mapreduce 字数中出现的最大字数
【发布时间】:2017-03-27 22:37:05
【问题描述】:

所以,我一直在关注本网站 (http://www.michael-noll.com/tutorials/writing-an-hadoop-mapreduce-program-in-python/) 上的 Mapreduce python 代码,它从文本文件中返回字数(即单词和它在文本中出现的次数)。但是,我想知道如何返回最大出现的单词。 mapper和reducer如下——

#Mapper

import sys

# input comes from STDIN (standard input)
for line in sys.stdin:
    # remove leading and trailing whitespace
    line = line.strip()
    # split the line into words
    words = line.split()
    # increase counters
    for word in words:
        # write the results to STDOUT (standard output);
        # what we output here will be the input for the
        # Reduce step, i.e. the input for reducer.py
        #
        # tab-delimited; the trivial word count is 1
        print '%s\t%s' % (word, 1)

#Reducer

from operator import itemgetter
import sys

current_word = None
current_count = 0
word = None

# input comes from STDIN
for line in sys.stdin:
    # remove leading and trailing whitespace
    line = line.strip()

    # parse the input we got from mapper.py
    word, count = line.split('\t', 1)

    # convert count (currently a string) to int
    try:
        count = int(count)
    except ValueError:
        # count was not a number, so silently
        # ignore/discard this line
        continue

    # this IF-switch only works because Hadoop sorts map output
    # by key (here: word) before it is passed to the reducer
    if current_word == word:
        current_count += count
    else:
        if current_word:
            # write result to STDOUT
            print '%s\t%s' % (current_word, current_count)
        current_count = count
        current_word = word

# do not forget to output the last word if needed!
if current_word == word:
    print '%s\t%s' % (current_word, current_count)

所以,我知道我需要在减速器的末尾添加一些东西,但我只是不完全确定是什么。

【问题讨论】:

  • 所以你只是想找到计数最多的单词并输出它?
  • 没错。计数最多的单词以及计数本身。
  • 我猜是在reducer的最后加了一点代码,但是我试过了,没有用。

标签: python hadoop mapreduce hadoop-streaming


【解决方案1】:

你只需要设置一个reducer来聚合所有的值(-numReduceTasks 1

你的 reduce 应该是这样的:

max_count = 0
max_word = None

for line in sys.stdin:
    # remove leading and trailing whitespace
    line = line.strip()

    # parse the input we got from mapper.py
    word, count = line.split('\t', 1)

    # convert count (currently a string) to int
    try:
        count = int(count)
    except ValueError:
        # count was not a number, so silently
        # ignore/discard this line
        continue

    # this IF-switch only works because Hadoop sorts map output
    # by key (here: word) before it is passed to the reducer
    if current_word == word:
        current_count += count
    else:
        # check if new word greater
        if current_count > max_count:
            max_count= current_count 
            max_word = current_word        
        current_count = count
        current_word = word

# do not forget to check last word if needed!
if current_count > max_count:
    max_count= current_count 
    max_word = current_word

print '%s\t%s' % (max_word, max_count)

但是只有一个 reducer,你会失去并行化,所以如果你在第一个之后运行这个作业,可能会更快,而不是相反。这样你的mapper就和reducer一样了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-07
    • 1970-01-01
    • 1970-01-01
    • 2020-06-04
    • 2011-02-02
    • 1970-01-01
    • 1970-01-01
    • 2011-04-03
    相关资源
    最近更新 更多