map-reduce与关系数据库

yduiuuwa  于 2021-06-04  发布在  Hadoop
关注(0)|答案(1)|浏览(293)

我有两个关系表
表a(1人,书名)
表b(书名、作者姓名)
我正在创建一个map reduce作业,它按作者统计表1中每个人阅读的书籍。
这意味着,如果有两本书是同一作者写的,而这两本书都读过,那么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中的每个人运行这个查询吗?

lhcgjxsq

lhcgjxsq1#

我们可以把给定的问题分成两个部分:
1) 在第一部分中,我们应该使用两个Map器创建一个map reduce作业。对于第一个mapper-a,表a是输入,对于第二个mapper-b,表b是输入。只有一个减速器。mapper a发出“book title”作为键和“person name#table-a”。mapper b发出“book title”作为键和“author name#table-b”
因为在Map中,一个键的reduce记录会被放到同一个reducer中,而在这个作业中,我们只有一个reducer,所以记录会像{书名}一样到达那里,
然后需要实现逻辑来提取人名和作者名。在reducer的末尾,reducer将输出为:book title%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\u name%人名
2) 在第二个map reduce作业中:只编码一个mapper和reducer。您的作业输入格式为:书名%author\u name%person name1、personname2等。。
对于Map器,输出键为author\u name+person,值为1。
因为在这个阶段,你有作者姓名和人名的组合,你只需要数到1,然后输出人名、作者姓名和总数。
请让我知道,如果这是不清楚你或你想看到实际的java代码。
谢谢!!

相关问题