Как устранить повторяющиеся имена файлов в hadoop mapreduce? - PullRequest
0 голосов
/ 07 февраля 2012

Я хочу исключить повторяющиеся имена файлов в моем выводе программы инвертированного индекса hadoop mapreduce. Например, вывод выглядит как - вещи: doc1, doc1, doc1, doc2 , но я хочу, чтобы это было похоже вещи: doc1, doc2

Ответы [ 2 ]

1 голос
/ 07 февраля 2012

Ну, вы хотите удалить дубликаты, которые были отображены, то есть вы хотите уменьшить список промежуточных значений до списка вывода без дубликатов. Лучше всего было бы просто преобразовать Iterator<Text> в методе reduce() в java Set и выполнить итерацию по нему, изменив:

while (values.hasNext()) {
    if (!first)
    toReturn.append(", ") ;
    first = false;
    toReturn.append(values.next().toString());
}

На что-то вроде:

Set<Text> valueSet = new HashSet<Text>();
while (values.hasNext()) {
    valueSet.add(values.next());
}

for(Text value : valueSet) {
    if(!first) {
        toReturn.append(", ");
    }
    first = false;
    toReturn.append(value.toString());
}

К сожалению, я не знаю лучшего (более краткого) способа преобразования Итератора в Набор.

Это должно иметь меньшую временную сложность, чем решение Orange, но более высокое потребление памяти.

@ Редактировать: немного короче:

Set<Text> valueSet = new HashSet<Text>();
while (values.hasNext()) {
    Text next = values.next();
    if(!valueSet.contains(next)) {
        if(!first) {
            toReturn.append(", ");
        }
        first = false;
        toReturn.append(value.toString());
        valueSet.add(next);
    }
}

Содержит должно быть (как добавить) постоянное время, поэтому теперь оно должно быть O (n).

0 голосов
/ 07 февраля 2012

Чтобы сделать это с минимальным количеством изменений кода, просто добавьте оператор if, который проверяет, находится ли объект, который вы собираетесь добавить, в toReturn:

if (!first)
    toReturn.append(", ") ;
first = false;
toReturn.append(values.next().toString());

изменяется на

String v = values.next().toString()
if (toReturn.indexOf(v) == -1) {  // indexOf returns -1 if it is not there
    if (!first) {
        toReturn.append(", ") ;
    }
    toReturn.append(v);
    first = false
}

Вышеупомянутое решение немного медленное, потому что оно должно обходить всю строку каждый раз, чтобы увидеть, есть ли эта строка. Вероятно, лучший способ сделать это - использовать HashSet для сбора элементов, а затем объединить значения из HashSet в окончательную строку вывода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...