2010-07-15 187 views
1

我正在寫一個簡單的程序,用於枚舉我的項目的有向圖中的三角形。首先,對於每個輸入弧(例如ab,bc,ca,請注意:選項卡符號用作分隔符)我希望我的映射函數輸出以下對([a,to_b],[b,from_a],[a_b, - 1):Hadoop ... Text.toString()轉換問題

public void map(LongWritable key, Text value, 
       OutputCollector<Text, Text> output, 
       Reporter reporter) throws IOException { 

    String line = value.toString(); 
    String [] tokens = line.split(" "); 

    output.collect(new Text(tokens[0]), new Text("to_"+tokens[1])); 
    output.collect(new Text(tokens[1]), new Text("from_"+tokens[0])); 
    output.collect(new Text(tokens[0]+"_"+tokens[1]), new Text("-1")); 

} 

現在我減少功能應該CROSS JOIN同時具有to_的和from_的 並簡單地發出任何其它對,它的鍵包含「_」全對。

 public void reduce(Text key, Iterator<Text> values, 
        OutputCollector<Text, Text> output, 
        Reporter reporter) throws IOException { 

    String key_s = key.toString(); 

    if (key_s.indexOf("_")>0) 
     output.collect(key, new Text("completed")); 

    else { 

      HashMap <String, ArrayList<String>> lists = new HashMap <String, ArrayList<String>>();  

      while (values.hasNext()) { 

       String line = values.next().toString(); 

       String[] tokens = line.split("_"); 
       if (!lists.containsKey(tokens[0])) { 
        lists.put(tokens[0], new ArrayList<String>()); 
       } 
      lists.get(tokens[0]).add(tokens[1]);  
      } 

      for (String t : lists.get("to")) 
       for (String f : lists.get("from")) 
        output.collect(new Text(t+"_"+f), key); 


    } 

} 

這就是最令人興奮的事情發生的地方。令牌[1]產生一個ArrayOutOfBounds異常。如果你向上滾動,你可以看到迭代器應該給出諸如「to_a」,「from_b」,「to_b」等等的值......當我輸出這些值時,一切看起來都很好,我有「to_a」 ,「from_b」。但是split()根本不起作用,而且line.length()始終爲1,indexOf(「」)返回-1!完全相同的索引完全適用於鍵...我們有鍵對包含「」並且看起來像「a_b」,「b_c」

的對,我真的很困惑這一切。 MapReduce應該可以拯救生命,使一切變得簡單。相反,我花了幾個小時纔將本地化...

我真的很感謝你的幫助,夥計! 在此先感謝!

回答

0

不知道這是通過嘗試改變這個問題:

String [] tokens = line.split(" "); 

這樣:

String [] tokens = line.split("\t"); 
+0

感謝,剛剛試了一下......不幸的是,它並沒有解決我的問題(( (但現在這條線看起來更專業了!) – VilleDePommes 2010-07-16 01:09:54

+0

好的我有點困惑,這個工作是否在mapper或reducer中失敗? – 2010-07-16 16:07:23

+0

在reducer中...例如,如果我剝離了我的reducer中的所有東西,並使其只傳播把它從一個映射器中獲得的每個數值,它完美的工作 - 「a」作爲一個關鍵我t輸出兩對「a,to_b」和「a,from_c」。但是,如果我想要它分割每個「to_something」和「from_something」,我會得到這種奇怪的情況,其中indexOf(「_」)返回-1 「to_b」 – VilleDePommes 2010-07-17 06:40:36