gpt4 book ai didi

python - Map Reduce 常见查询的简单分数聚合

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:31:25 27 4
gpt4 key购买 nike

我的一个映射器生成一些分布在文件中的日志,例如 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 阶段,我可以在其中收集相同的查询并汇总(加起来)它们的分数。

我的映射器函数可以是一个标识,在 reduce 中我将完成这个任务。

输出将是:

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

似乎是一项简单的任务,但我无法想到我该如何进行(阅读了很多但无法真正进行)。我可以从通用算法问题的角度来思考,首先我会收集常见的查询,然后将它们的分数相加。

任何有关 pythonic 解决方案或算法(map reduce)的提示的帮助都将不胜感激。

最佳答案

这是 MapReduce 解决方案:

map 输入:每个输入文件(第 0 部分、第 1 部分、第 2 部分……)都可以输入到单独的(单独的) map task 。

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));
}

该方法将对所有 aggScores 求和对于特定的 q并给你想要的输出。 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))

关于python - Map Reduce 常见查询的简单分数聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15062517/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com