【问题标题】:Map Reduce Simple score aggregating for common queriesMap Reduce 常见查询的简单分数聚合
【发布时间】:2013-02-25 08:04:17
【问题描述】:

我的一个映射器生成了一些分布在文件中的日志,例如 part-0、part-1、part-2 等。现在每个文件都有一些查询和一些与该查询相关的数据:

part-0

q             score         
1 ben 10      4.01
horse shoe    5.96
...

part-1

1 ben 10        3.23
horse shoe      2.98
....

and so on for part-2,3 etc.

现在相同的查询 q 即上面的“1 ben 10”驻留在第 1 部分、第 2 部分等中。

现在我必须编写一个 map reduce 阶段,在其中我可以收集相同的查询并汇总(加起来)它们的分数。

我的 mapper 函数可以是一个身份,在 reduce 中我将完成这项任务。

输出将是:

q       aggScore
1 ben 10    7.24
horse shoe  8.96
...

似乎是一项简单的任务,但我无法想到如何继续进行(阅读了很多但实际上无法继续)。我可以考虑通用算法问题,首先我将收集常见查询,然后将它们的分数相加。

任何有关pythonic解决方案或算法(地图减少)提示的帮助将不胜感激。

【问题讨论】:

  • What have you tried?你使用什么方法从文件中读取、存储数据、操作数据,然后显示给用户?
  • 我正在使用 Hadoop 流。输入来自标准输入,然后进入标准输出。

标签: python algorithm mapreduce


【解决方案1】:

这里是 MapReduce 解决方案:

地图输入:每个输入文件(part-0、part-1、part-2、...)都可以输入到单独的(单独的)地图任务中。

foreach 输入文件中的输入行, 映射器发出<q,aggScore>。如果单个文件中的查询有多个分数,Map 会将它们全部相加,否则如果我们知道每个查询只会出现在每个文件中一次,则 map 可以是一个恒等函数,为每个输入行发出 <q,aggScore> 为是。

Reducer 输入的格式为<q,list<aggScore1,aggScore2,...>。Reducer 操作类似于著名的 MapReduce 示例wordcount。如果您使用的是 Hadoop,则可以使用以下方法进行 Reducer。

public void reduce(Text q, Iterable<IntWritable> aggScore, Context context) throws IOException, InterruptedException {
   int sum = 0;
   for (IntWritable val : aggScore) {
      sum += val.get();
   }
   context.write(q, new IntWritable(sum));
}

该方法将对特定q 的所有aggScores 求和,并为您提供所需的输出。 reducer 的 python 代码应该是这样的(这里q 是键,aggScores 的列表是值):

def reduce(self, key, values, output, reporter):
    sum = 0
    while values.hasNext():
        sum += values.next().get()
    output.collect(key, IntWritable(sum))

【讨论】:

    猜你喜欢
    • 2014-04-09
    • 2021-06-02
    • 2011-07-14
    • 1970-01-01
    • 1970-01-01
    • 2014-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多