我正在寫一個簡單的程序,用於枚舉我的項目的有向圖中的三角形。首先,對於每個輸入弧(例如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應該可以拯救生命,使一切變得簡單。相反,我花了幾個小時纔將本地化...
我真的很感謝你的幫助,夥計! 在此先感謝!
感謝,剛剛試了一下......不幸的是,它並沒有解決我的問題(( (但現在這條線看起來更專業了!) – VilleDePommes 2010-07-16 01:09:54
好的我有點困惑,這個工作是否在mapper或reducer中失敗? – 2010-07-16 16:07:23
在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