簡體   English   中英

使用關系數據庫進行Map Reduce

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM