我正在编写一个简单的程序,用于在我的项目的有向图中枚举三角形。首先,对于每个输入弧(例如ab,bc,ca,注意:标签符号用作分隔符)我希望我的地图函数输出以下对([a,to_b],[b,from_a],[a_b, - 1]):
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"));
}
现在我的reduce函数应该交叉连接所有同时具有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);
}
}
这是最激动人心的事情发生的地方。 tokens [1]产生一个ArrayOutOfBounds异常。如果向上滚动,你可以看到迭代器应该给出“to_a”,“from_b”,“to_b”等值...当我输出这些值时,一切看起来都没问题,我有“to_a” ,“from_b”。但是split()根本不起作用,而且line.length()总是1而indexOf(“”)返回-1!完全相同的indexOf WORKS PERFECTLY for keys ...其中我们有对,其键包含“”并且看起来像“a_b”,“b_c”
我真的很困惑这一切。 MapReduce应该拯救生命,使一切变得简单。相反,我花了几个小时来本地化这个......
我真的很感谢你的帮助,伙计们! 提前谢谢!
答案 0 :(得分:0)
尝试更改此信息时,请确定是否存在问题:
String [] tokens = line.split(" ");
到此:
String [] tokens = line.split("\t");