У меня есть два файла:
fileA.txt:
learn hadoop
learn java
fileB.txt:
hadoop java
eclipse eclipse
Желаемый результат:
learn fileA.txt:2
hadoop fileA.txt:1 , fileB.txt:1
java fileA.txt:1 , fileB.txt:1
eclipse fileB.txt:2
Мой метод уменьшения:
public void reduce(Text key, Iterator<Text> values,
OutputCollector<Text, Text> output, Reporter reporter)
throws IOException {
Set<Text> outputValues = new HashSet<Text>();
while (values.hasNext()) {
Text value = new Text(values.next());
// delete duplicates
outputValues.add(value);
}
boolean isfirst = true;
StringBuilder toReturn = new StringBuilder();
Iterator<Text> outputIter = outputValues.iterator();
while (outputIter.hasNext()) {
if (!isfirst) {
toReturn.append("/");
}
isfirst = false;
toReturn.append(outputIter.next().toString());
}
output.collect(key, new Text(toReturn.toString()));
}
Мне нужна помощь с счетчиком (подсчитайте слова по файлу)
Мне удалось распечатать:
learn fileA.txt
hadoop fileA.txt / fileB.txt
java fileA.txt / fileB.txt
eclipse fileB.txt
но не может печатать количество в файле
Любая помощь будет высоко ценится
как я понимаю, это должно печатать то, что вы хотите:
@Override
public void reduce(Text key, Iterator<Text> values, OutputCollector<Text, Text> output, Reporter reporter) throws IOException {
Map<String, Integer> fileToCnt = new HashMap<String, Integer>();
while(values.hasNext()) {
String file = values.next().toString();
Integer current = fileToCnt.get(file);
if (current == null) {
current = 0;
}
fileToCnt.put(file, current + 1);
}
boolean isfirst = true;
StringBuilder toReturn = new StringBuilder();
for (Map.Entry<String, Integer> entry : fileToCnt.entrySet()) {
if (!isfirst) {
toReturn.append(", ");
}
isfirst = false;
toReturn.append(entry.getKey()).append(":").append(entry.getValue());
}
output.collect(key, new Text(toReturn.toString()));
}