2013-03-13 41 views
0

我正在實施兩個相位矩陣乘法。以下是第一階段的減速器。密鑰是來自左側文件的行索引和來自右側文件的列索引。我期望輸出計數映射和減速器是相同的。但它看起來像內循環增加了與外循環相同的迭代器,因此減速器輸出的數量等於鍵的數量。循環兩次在reducer口頭

一段代碼:

@Override 
     public void reduce(Text key, Iterable<Text> values, Context context) 
     throws IOException, InterruptedException 
     { 
      for (Text outer : values) { 
       String [] outerLine = outer.toString().split("\t"); 
       //int outerIndex = 0; 
       //outerIndex = outerLine[0].equalsIgnoreCase(leftFilePattern) ? outerIndex : 1; 
       if(outerLine[0].equalsIgnoreCase(rightFilePattern)) 
        continue; 
       double outerValue = Double.parseDouble(outerLine[2]); 
       for (Text inner : values) { 
        String [] innerLine = inner.toString().split("\t"); 
        if(innerLine[0].equalsIgnoreCase(leftFilePattern)) 
         continue; 
        context.write(new Text(key.toString() + "-" + innerLine[1]), 
           new DoubleWritable(outerValue * Double.parseDouble(innerLine[2]))); 
       } 
      } 

但是,當我有簡單的Java應用程序類似以下內容:

List<Integer> l = Arrays.asList(10, 15); 
     Iterable<Integer> it = l; 
     for (Integer in : it) { 
      for (Integer out : it) { 
       System.out.println(in + " " + out); 
      } 
     } 

這裏輸出的數量是4,如果內環作品相同減速機,輸出的情況下,計數應該是1即(10 15)。

有人可以解釋這種行爲。

維沙爾

回答

0

有實施Iterable的一個可能的方式,可能會導致這種效果。

意圖似乎是每個iterator()調用應該返回自己的Iterator實例。在java.util中的Iterable類包括Arrays.asList()所使用的私人List類,全部這樣做。對於同樣的Iterable嵌套的foreach需要此行爲,並且Iterable的陳述目的是foreach支持。

我找不到Iterable API文檔中直接需要該行爲的任何內容。

顯然,如果使用相同的對象作爲兩個iterator()調用的結果,則在同一個Iterable上嵌套的foreach語句將按您描述的方式失敗。

============================================== ===========

如果這是發生了什麼,我最好的建議是在values執行初始通複製每個文本參照乖巧如List<Text>ArrayList。你可以安全地對你的元素進行嵌套循環。

+0

yeh不同的實現可以自由地實現它不同,但它們應該使用不同的名稱。對不同的行爲使用相同的名稱使得難以使用... – 2013-03-14 01:57:07

+1

@VishalKumar Iterator接口API文檔確實應該指定每個iterator()調用返回一個不同的對象。 – 2013-03-14 02:27:08