gpt4 book ai didi

mysql - 使用关系数据库进行 Map Reduce

转载 作者:可可西里 更新时间:2023-11-01 15:38:00 27 4
gpt4 key购买 nike

我有 2 个关系表

表 A(第 1 个人,阅读的书名)

表 B(书名,作者姓名)

我正在创建一个 map-reduce 作业,它按作者计算表 1 中每个人阅读的书籍。

这意味着如果同一作者有 2 本书并且该人阅读了这两本书,那么 map-reduce 将产生:

(人 1,作者 1、2);

我的 map 功能(在元级别)是:

 map {

emit(TableB.BookTitle, 1)
}

我的 reduce 函数是:

reduce function (title,values)
{
while(values.hasNext())
{
if(title == tableA.bookRead)
sum+=values
}

output.collect(tableA.person1, tableB.author, sum)
}

我知道阅读书籍的人之间有一些漏洞需要填补,但我不太确定如何处理它?另外,我是否必须为表 B 中的每个人运行此查询?

最佳答案

我们可以将给定的问题分解为两个工作:

1) 在第一部分中,我们应该使用两个映射器创建一个 map reduce 作业。对于第一个 Mapper-A,表 A 是输入,对于第二个 Mapper-B,表 B 是输入。并且只有一个reducer。Mapper A 发出“Book Title”作为键和“Person Name#Table-A”。Mapper B 发出“Book Title”作为 Key 和“Author Name#Table-B”

因为在 Map-Reduce 中,一个键的记录会转到同一个 reducer,而在这项工作中,我们只有一个 reducer,所以记录会到达那里,比如{书名,

然后您需要实现提取人名和作者姓名的逻辑。在 reducer 端,Reducer 将输出如下:书名 %Author Name%PersonName

例如。

while(values.hasNext())
{
String line = values.next().toString();
String[] det_array = line.split("#");
if(det_array[0].equals("person_book"))
{
person_name = det_array[1];
emit_value = emit_value + person_name + ",";
}
else if(det_array[0].equals("auth_book") && !author_seen)
{
author_name = det_array[1];
emit_value = emit_value + "%" + author_name + "%" + ",";
author_seen = true;
}

}
output.collect(new Text(key),new Text(emit_value));

那么您的最终输出文件将如下所示:书名 %Author_Name%Person Name

2) 在第二个 Map Reduce 作业中:只编写一个 Mapper 和 Reducer。您工作的输入格式为:书名 %Author_Name%Person Name1,PersonName2 等..

对于您的映射器输出键是 Author_Name+Person 并且值为 1。

在这个阶段,您在 Reducer 中拥有 Author_Name 和 Person 的组合,您只需要计数 1 并作为 Person Name、Author Name 和 Total Count 发出输出。

如果您不清楚,或者您想查看实际的 Java 代码,请告诉我。

谢谢!!

关于mysql - 使用关系数据库进行 Map Reduce,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22495582/

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