我有两个关系表
表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中的每个人运行这个查询吗?
1条答案
按热度按时间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
例如。
最后的输出文件如下:书名%author\u name%人名
2) 在第二个map reduce作业中:只编码一个mapper和reducer。您的作业输入格式为:书名%author\u name%person name1、personname2等。。
对于Map器,输出键为author\u name+person,值为1。
因为在这个阶段,你有作者姓名和人名的组合,你只需要数到1,然后输出人名、作者姓名和总数。
请让我知道,如果这是不清楚你或你想看到实际的java代码。
谢谢!!