【问题标题】:Finding the max _length of word using MapReduce使用 MapReduce 查找单词的最大长度
【发布时间】:2021-11-10 15:22:47
【问题描述】:

我需要使用 MapReduce 从 txt 文件中查找所有最长的单词。 我为 mapper 和 reducer 编写了以下代码,但它将 len(words) 的整个字典显示为 Key,将单词显示为 Values。 我需要帮助编写代码以仅显示最大长度和相应单词的结果。 以下是我的代码:

"""mapper.py"""
import sys
> for line in sys.stdin:
>   for word in line.strip().split():
>      print ('%s\t%s' % (len(word), word))



"""reducer.py"""

> import sys results={} for line in sys.stdin:
>     index, value = line.strip().split('\t')
>     if index not in results :
>         results[index] = value
>     else :
>         results[index] += ' '
>         results[index] += value

*****我只是卡在这部分继续编码以获得具有相应单词的max(key)

输入文件: 和平如何开始? 和平从说对不起开始, 和平始于不伤害他人, 和平始于诚实、信任和奉献, 和平始于表现出合作和尊重。 世界和平从我开始!

预期输出: 最长的单词有 11 个字符。词是:奉献合作

【问题讨论】:

  • 你的输入是什么样的?
  • 输入是一个带有文本的csv文件
  • 为了让我们帮助您,您有必要提供一个最小的可重现问题集,包括样本输入、预期输出、实际输出以及重现该示例所需的所有相关代码。你所提供的没有达到这个目标。请编辑您的问题以显示最小的可重现集。详情请见Minimal Reproducible Example
  • 对不起,我已经添加了@itprorh66的信息。

标签: python list dictionary mapreduce max


【解决方案1】:

我不确定你在用stdin 做什么,或者你为什么要导入sys。此外,示例输入文件似乎不是 csv 格式,而只是一个简单的文本文件。据我了解您的问题,您想读取输入文件,测量每个单词的长度并报告最大单词或单词的长度并列出符合此标准的单词。考虑到这一点,这就是我将如何进行:

inputFile = r'sampleMapperText.txt'
with open(inputFile, 'r') as f:
    reslt = dict()  #keys = word lengths, values = words of key length
    text = f.read().split('\n')
    for line in text:
        words = line.split()
        for w in words:
            wdlist = reslt.pop(len(w), [])
            wdlist.append(w)
            reslt[len(w)] = wdlist
    maxLen = max(list(reslt.keys()))
    print(f"Max Word Length = {maxLen}, Longest words = {', '.join(reslt[maxLen])}")   

运行此代码会产生:

Max Word Length = 12, Longest words = dedications,

如果您坚持将流程分成两个单独的文件。假设这两个文件在同一个目录中,我会这样做:

reducer.py 文件的内容是:

# reducer.py 
def getData(filepath: str) -> list([str]):
    with open(filepath, 'r') as f:
        text = f.read().split('\n')
    return text   

mapper.py 文件的内容是:

# mapper.py
from reducer import getData

def mapData(text:list(str)):
    reslt = dict()  #keys = word lengths, values = words of key length
    for line in text:
        words = line.split()
        for w in words:
            wdlist = reslt.pop(len(w), [])
            wdlist.append(w)
            reslt[len(w)] = wdlist
    maxLen = max(list(reslt.keys()))
    print(f"Max Word Length = {maxLen}, Longest words = {', '.join(reslt[maxLen])}")     

inputFile = r'sampleMapperText.txt'
mapData(getData(inputFile))  

【讨论】:

  • stdinsys 指的是我目前正在使用的 edu.platform。是的,您对文件类型的看法是正确的,我输入错误。我需要将查找最大单词长度的任务分为两个步骤,即。**mapper.py** 和 reducer.py 并且必须相应地进行编码,以便结果输出为任务需要什么。映射器代码输出应产生结果并将其分解为(键:值)对。我只是在努力将代码提供给减速器部分,你的代码示例很完美,但我只是不知道如何在 reducery.py 中拆分其中的一部分。
  • 一些小改动,但代码运行良好,我得到了所需的输出。 mapper.py 在 reducer.py 之前。
猜你喜欢
  • 2021-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多