[英]Map Reduce with Relational Databases
我有2個關系表
表A(人1,已讀書名)
表B(書名,作者名)
我正在創建一個map-reduce作業,該作業會按作者的數量對表1中每個人閱讀的書進行計數。
這意味着,如果同一作者有兩本書,並且該人閱讀了這兩本書,那么map-reduce將產生:
(Person1,作者1、2);
我的地圖功能(在元級別)是:
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)在第一部分中,我們應該使用兩個映射器創建一個映射約簡工作。 對於第一個Mapper-A,表A是輸入,對於第二個Mapper-B,表B是輸入。 而且只有一個減速器。 映射器A發出“ BooK標題”作為鍵,並發出“人名#Table-A”。 映射器B發出“書名”作為鍵,並發出“作者姓名#Table-B”
由於在Map-Reduce中,一個鍵的記錄進入了同一化簡器,而在這項工作中,我們只有一個化簡器,因此記錄將像{Book Title,
然后,您需要實現邏輯以提取出“人名”和“作者名”。 在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%人名
2)在第二張Map Reduce作業中:僅編寫一個Mapper和Reducer。 您的工作的輸入格式為:書名%Author_Name%Person Name1,PersonName2等。
對於您的Mapper,輸出鍵為Author_Name + Person,值為1。
在此階段,Reducer中具有Author_Name和Person的組合,您只需要計數1並輸出為Person Name,Author Name和Total Count。
如果您不清楚這還是您想查看實際的Java代碼,請告訴我。
謝謝 !!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.