Я пишу простую программу для перечисления треугольников в ориентированных графах для моего проекта. Во-первых, для каждой входной дуги (например, ab, bc, ca, note: символ табуляции служит в качестве разделителя). Я хочу, чтобы моя функция отображения отображала следующие пары ([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"));
}
Теперь моя уменьшить функция должна пересечь присоединиться все пары, которые имеют как 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! Тот же indexOf WORKS PERFECTLY для ключей ... где у нас есть пары, ключи которых содержат «» и выглядят как «a_b», «b_c»
Я действительно озадачен этим. MapReduce должен спасать жизни, делая все просто. Вместо этого я потратил несколько часов, чтобы просто локализовать это ...
Я очень благодарен за вашу помощь, ребята !!! Спасибо заранее!
спасибо, просто попытался это ... К сожалению, не удалось решить мою проблему (((Но теперь линия выглядит более профессионально!) – VilleDePommes
ok Я немного смущен - это неудачная работа в Mapper или в редукторе? –
в редукторе ... например, если я отключу все от моего редуктора и сделаю так, чтобы он просто распространялся до каждого значения, которое он получает от картографа, он отлично работает - для «a» в качестве ключа i t выводит две пары «a, to_b» и «a, from_c». Однако, если я хочу, чтобы он разбивал каждый «to_something» и «from_something», я получаю эту странную ситуацию, где indexOf («_») возвращает -1 для "to_b" – VilleDePommes