2010-07-15 8 views
1

J'écris un programme simple pour énumérer des triangles dans des graphes orientés pour mon projet. Premièrement, pour chaque arc d'entrée (par exemple ab, bc, ca, note: un symbole d'onglet sert de délimiteur) Je veux que ma fonction de carte produise les paires suivantes ([a, to_b], [b, from_a], [a_b, - 1]):Hadoop ... Problèmes de conversion 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")); 

} 

maintenant, ma fonction reduce est censé se joindre à traverser toutes les paires qui ont deux années to_ et from_ de et d'émettre simplement toutes les autres paires dont les clés contiennent « _ ».

 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); 


    } 

} 

Et c'est là que les choses les plus excitantes se produisent. tokens [1] génère une exception ArrayOutOfBounds. Si vous faites défiler vers le haut, vous pouvez voir que par ce point l'itérateur doit donner des valeurs comme "to_a", "from_b", "to_b", etc ... quand je viens de sortir ces valeurs, tout a l'air ok et j'ai "to_a" , "from_b". Mais split() ne fonctionne pas du tout, line.length() est toujours 1 et indexOf ("") renvoie -1! Le même index de WORKS PARFAITEMENT pour les clés ... où nous avons des paires dont les clés contiennent "" et ressemblent à "a_b", "b_c"

Je suis vraiment perplexe avec tout cela. MapReduce est censé sauver des vies en simplifiant tout. Au lieu de cela, j'ai passé plusieurs heures à localiser juste cela ...

J'apprécierais vraiment votre aide, les gars !!! Merci d'avance!

Répondre

0

Je ne sais pas si c'est le problème en essayer de le changer:

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

à ceci:

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

merci, juste essayé ... Malheureusement, il n'a pas résolu mon problème (((Mais la ligne semble plus professionnelle maintenant!) – VilleDePommes

+0

ok Je suis un peu confus si ce travail échoue dans le mapper ou dans le réducteur –

+0

dans un réducteur ... par exemple, si je retire tout de mon réducteur et que je le fais juste pour propager jusqu'à chaque valeur qu'il obtient à partir d'un mappeur, cela fonctionne parfaitement - pour "un" comme une clé i t sort deux paires "a, to_b" et "a, from_c." Cependant, si je veux séparer chaque "to_something" et "from_quechose", j'obtiens cette situation bizarre, où indexOf ("_") renvoie -1 pour "to_b" – VilleDePommes