Ich arbeite an einem mapreduce-Programm mit hadoop.
Ich habe diesen Teil des Codes in meinem Minderer:Zweite Iteration - Werte bleiben gleich
public void reduce(Text key, Iterable<TextLongWritable> values,Context context) throws IOException, InterruptedException {
long word1count = 0;
List<TextLongWritable> cache = new ArrayList<TextLongWritable>();
String decade = key.toString().split("\t")[0];
String word1 = key.toString().split("\t")[1];
for (TextLongWritable val : values) {
if (val.getWord().equals("*")){
word1count += val.getCount();
continue;
}
cache.add(val);
log.info("***Reducer*** Word1: " + word1 + " Word2: " + val.getWord());
}
context.write(key, new Text("" + word1count));
for (TextLongWritable value : cache) {
if (value.getWord().equals("*")){
continue;
}
log.info("***Reducer*** Word1: " + word1 + " Word2: " + value.getWord());
context.write(new Text(decade + "\t" + value.getWord()), new Text(word1 + " " + value.getCount() + "\t" + word1count));
}
}
Erstens, ich bin mit Caching, wie ich here um sah zweimal auf Werte zu durchlaufen.
Mein Problem ist, dass in der zweiten Schleife alle Werte gleich bleiben. Zum Beispiel, wenn ich eine Liste mit den Wörtern one
two
three
habe. Sagen wir, der Schlüssel ist 1900 test
, so dass word1 = "test"
.
Das wird erste Logger ausgegeben:
***Reducer*** Word1: test Word2: one
***Reducer*** Word1: test Word2: two
***Reducer*** Word1: test Word2: three
Aber die zweite Logger ausgegeben wird: aus irgendeinem Grund
***Reducer*** Word1: test Word2: one
***Reducer*** Word1: test Word2: one
***Reducer*** Word1: test Word2: one
Der Wert bleibt gleich.
Was mache ich hier falsch? Hat es etwas mit Hadoop zu tun?