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!
merci, juste essayé ... Malheureusement, il n'a pas résolu mon problème (((Mais la ligne semble plus professionnelle maintenant!) – VilleDePommes
ok Je suis un peu confus si ce travail échoue dans le mapper ou dans le réducteur –
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