hadoop Счетчик обращенных индексов

1

У меня есть два файла:

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

но не может печатать количество в файле

Любая помощь будет высоко ценится

  • 0
    Возможно, постарайтесь перечислить, какие проблемы у вас конкретно возникают с этим, это поможет побудить людей публиковать краткие решения. Добро пожаловать в переполнение стека!
  • 0
    Задумывались ли вы, чтобы вместо ключа вместо слова и имени файла использовался стандартный класс IntSumReducer?
Теги:
hadoop
mapreduce

1 ответ

1
Лучший ответ

как я понимаю, это должно печатать то, что вы хотите:

@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()));
}
  • 0
    Спасибо, это помогло мне решить мою проблему! Можете ли вы порекомендовать какие-либо источники, чтобы узнать больше о mapReduce и Hadoop с новыми Api.cheers
  • 0
    Я могу рекомендовать только hadoopbook.com .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню