【问题标题】:Map Reduce Removing DuplicatesMap Reduce 删除重复项
【发布时间】:2020-12-14 10:40:44
【问题描述】:

我收到了一个大文本文件,我想找出以每个字母开头的不同单词的数量。我正在尝试了解 map 和 reduce 函数的输入和输出值。

我理解一个不需要处理重复单词的简单问题:使用 map reduce 确定字母表中每个字母在文本中开始单词的频率。

Map input: <0, “everyday i am city in tomorrow easy over school i iterate tomorrow city community”>

Map output: [<e,1>,<i,1>,<a,1>,<c,1>,<i,1>,<t,1>,<e,1>,<o,1>,<s,1>,<i,1>,<i,1>,<t,1>,<c,1>,<c,1>]

Reduce input: <a,[1]>,<c,[1,1,1]>,<e,[1,1]>,<i,[1,1,1,1]>,<o,[1]>,<s,[1]>,<t,[1,1]>

Reduce output: [<a,1>,<c,3>,<e,2>,<i,4>,<o,1>,<s,1>,<t,2>]

对于上述问题,单词“i”“city”和“tomorrow”出现了不止一次,所以我的最终输出应该是:

Reduce output: [<a,1>,<c,2>,<e,2>,<i,3>,<o,1>,<s,1>,<t,1>]

我不确定如何确保在上述问题中删除重复的单词(是在预处理阶段完成还是在 map 或 reduce 函数上实现)。如果能帮助我理解地图并减少新问题的输出,我将不胜感激。

【问题讨论】:

    标签: mapreduce


    【解决方案1】:

    您可以在两个 map-reduce 过程中做到这一点:

    1. 通过使用 word 作为 map 输出并在 reduce 中将每个单词输出一次来查找所有不同的单词
    2. 您已经解决了 - 找出每个唯一单词上每个首字母的频率。

    或者,由于没有多少唯一单词,您可以将它们缓存在映射器中,并且每个单词(或其第一个字母)只输出一次,reduce 将与您更简单的问题相同。实际上,不,这行不通,因为相同的单词可以出现在不同的映射器中。但是您仍然可以在第一个解决方案中将单词缓存在 mapper 中,并且每个 mapper 只输出每个单词一次 - map 和 reduce 之间的流量会少一点。

    【讨论】:

    • 是的,我想这就是我要找的。只是为了正确理解:然后我会有 2 个 mapreduce(即 map->reduce->map->reduce)阶段?第一个删除重复的单词,第二个找到频率(上面解释的更简单的问题)
    【解决方案2】:

    也许这样的事情会有所帮助,

    let str = "everyday i am city in tomorrow easy over school i iterate tomorrow city community"
    
    let duplicatesRemoved = Set(str.split(separator: " "))
    

    输出:

    ["city", "community", "tomorrow", "easy", "everyday", "over", "in", "iterate", "i", "am", "school"]
    

    也许你不需要那些映射语句并且可以实现这样的目标,

    代码

    var varCount = [Character: Int]()
    for subStr in duplicatesRemoved {
        if let firstChar = subStr.first {
            varCount[firstChar] = (varCount[firstChar] ?? 0) + 1
        }
    }
    

    输出

    ["i": 3, "t": 1, "e": 2, "c": 2, "s": 1, "a": 1, "o": 1]
    

    【讨论】:

    • 我想我想要实现的是仅使用 mapreduce 的完整解决方案。预处理阶段是适用于上述示例的简单解决方案。我想如果使用多个节点引入多个文件,效率会降低。
    • 嗯,也许你可以这样做,>Map input: &lt;0, “everyday i am city in tomorrow easy over school i iterate tomorrow city community”&gt; >Map output: [&lt;easy,1&gt;,&lt;i,1&gt;,&lt;tomorrow,1&gt;,&lt;tomorrow,1&gt;,...] >` 减少输入:,,...>` >Reduce output: [&lt;a,1&gt;,&lt;c,2&gt;,&lt;t,1&gt;...]
    猜你喜欢
    • 1970-01-01
    • 2013-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-12
    • 1970-01-01
    • 2012-03-20
    • 1970-01-01
    相关资源
    最近更新 更多