当前位置: 首页 > 知识库问答 >
问题:

获取Hadoop Mapreduce字数中出现的最大字数

越俊艾
2023-03-14

所以,我一直在跟踪这个网站上的Mapreduce python代码(http://www . Michael-noll . com/tutorials/writing-an-Hadoop-Mapreduce-program-in-python/),它从一个文本文件中返回字数(即单词及其在文本中出现的次数)。但是,我想知道如何返回出现次数最多的单词。映射器和缩减器如下-

#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)

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

共有1个答案

施靖
2023-03-14

您只需要设置一个减速器来聚合所有值(-numReduceTask 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)

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

 类似资料:
  • 问题内容: 给定字符串: 如何获得每个字符的出现次数? 问题答案: 效率不高,但是只有一行…

  • 问题内容: 我需要定义数字的最后一位数字,并将其分配给值。此后,返回最后一位数字。 我的代码段无法正常工作… 码: 题: 如何解决这个问题? 问题答案: 刚回来; 即取模数。这将比解析字符串要快得多。 如果可以为负则使用

  • 问题内容: 我确实检测到一个数字的位数。例如,具有数字。 我所做的只是将数字解析为字符串,并获取字符串长度,例如: 但是,有没有一种最快的方法可以对数字进行计数?我必须多次使用此方法,因此我认为使用会影响性能。 谢谢。 问题答案: Math.floor(Math.log10(number) + 1) // or just (int) Math.log10(number) + 1 例如: 输出:

  • 如何获得最大截面。Id位于下面的文档中,其中包含集合_id=一些参数 我在下面试过了 但是,它不是返回max int单个值,而是返回一个包含部分数组中所有Ids的数组。 在节点中执行时,进一步执行相同的查询。js它返回一个空数组。

  • 本文向大家介绍JavaScript实现计算字符串中出现次数最多的字符和出现的次数,包括了JavaScript实现计算字符串中出现次数最多的字符和出现的次数的使用技巧和注意事项,需要的朋友参考一下 “计算出字符串中出现次数最多的字符是什么,出现了多少次?” 看到这个需求,我想大多数人应该首先想到的是转换成数组,再做处理,当然是可以解决问题的,然后这里提供一个巧妙的算法设计,无需转数组,可以很快解决问

  • 问题内容: 我正在寻找一种确定JavaScript数组中哪个元素的出现次数最多的优雅方法(mode)。 例如,在 该元素是最常见的元素。 问题答案: 这只是模式。这是一个 快速的,未优化的 解决方案。它应该是O(n)。