2015-10-07 150 views
0

嗨,我很新的Hadoop和mapreduce ..我想知道是否有這樣的事情是可能的。 我試圖通過MapReduce的兩個文件進行比較.. 第一個文件可能看起來是這樣的:比較Hadoop MapReduce中的兩個文件

t1 r1 
t2 r2 
t1 r4 

第二個文件將是這個樣子:

u1 t1 r1 
u2 t2 r3 
u3 t2 r2 
u4 t1 r1 

我希望它基於文件發出u1,u3u4。第二個文件將比第一個文件大得多。我不太清楚如何比較這些文件;這是在一個MapReduce工作中可行嗎?如果必須,我願意鏈接MapReduce作業。

+0

有多大,你想這些文件使用MapReduce? – YoungHobbit

+0

第二個文件至少爲1GB。第一個文件實際上是給定第二個文件上MapReduce的結果,例如所有以「u1」開頭的行。 – user5004049

回答

0

您可以通過將第一個文件放入分佈式緩存並遍歷映射階段中的第二個文件進行連接來執行mapside連接。

如何從分佈式緩存讀取:

@Override 
     protected void setup(Context context) throws IOException,InterruptedException 
     { 
      Path[] filelist=DistributedCache.getLocalCacheFiles(context.getConfiguration()); 
      for(Path findlist:filelist) 
      { 
       if(findlist.getName().toString().trim().equals("mapmainfile.dat")) 
       { 

        fetchvalue(findlist,context); 
       } 
      } 

     } 
     public void fetchvalue(Path realfile,Context context) throws NumberFormatException, IOException 
     { 
      BufferedReader buff=new BufferedReader(new FileReader(realfile.toString())); 
      //some operations with the file 
     } 

如何將文件添加到分佈式緩存:

DistributedCache.addCacheFile(new URI("/user/hduser`/test/mapmainfile.dat"),conf);` 
0

您可以使用映射器端連接進行比較。使用分佈式緩存將較小的文件傳遞給所有映射器,並通過映射器記錄讀取較大的文件記錄。

現在,您可以輕鬆比較大文件記錄與小文件(來自分佈式緩存)併發出匹配的記錄。

注意:這隻有在第一個文件足夠小以適應映射器的內存時纔有效。一般是目錄文件或查找文件

0

可以使用減少側加入,如果這兩個文件都很大,對於:

  1. 使用MultipleInput格式爲這兩個文件中的每一個創建兩個映射器。所以一個輸入文件去一個映射器,另一個文件去另一個映射器。
  2. 發送第一個映射器輸出的數據作爲組合鍵(TextPair)的鍵。該對中的第一部分類似於「t1​​ r1」,「t1,r2」等,第二部分是來自第一映射器的「0」以及來自第二映射器的「1」。對於值,從第一個映射器發出nullWritable,從2nd發出u1,u2等。因此,第一個映射器的輸出將是((「t1 r1」,「0」),null),第二個映射器輸出爲((「t1 r1」,1),u1),((「t1 r1」,1 「),u4)等使用第一個映射器中的」0「,以便首先接收第一個映射器輸出
  3. 基於TextPair鍵的第一部分實現分區器和組比較器
  4. 在reducer中您將獲得數據分組((「t1 r1」,0「),null),((」t1 r1「,1」),u1),((「t1 r1」,1「),u4) ]
  5. 放棄所有不與「0」(所以它會刪除無與倫比項),併發出值U1的休息,U4拳頭鍵輸入等