2010-07-15 3 views
1

Я пишу простую программу для перечисления треугольников в ориентированных графах для моего проекта. Во-первых, для каждой входной дуги (например, 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 должен спасать жизни, делая все просто. Вместо этого я потратил несколько часов, чтобы просто локализовать это ...

Я очень благодарен за вашу помощь, ребята !!! Спасибо заранее!

ответ

0

не уверен, что проблема при попытке это изменить:

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

к этому:

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

спасибо, просто попытался это ... К сожалению, не удалось решить мою проблему (((Но теперь линия выглядит более профессионально!) – VilleDePommes

+0

ok Я немного смущен - это неудачная работа в Mapper или в редукторе? –

+0

в редукторе ... например, если я отключу все от моего редуктора и сделаю так, чтобы он просто распространялся до каждого значения, которое он получает от картографа, он отлично работает - для «a» в качестве ключа i t выводит две пары «a, to_b» и «a, from_c». Однако, если я хочу, чтобы он разбивал каждый «to_something» и «from_something», я получаю эту странную ситуацию, где indexOf («_») возвращает -1 для "to_b" – VilleDePommes

Смежные вопросы