2017-02-16 5 views
1

Я новичок в hadoop, я пытаюсь создать программу, которая возьмет входной файл, описывающий график с ребрами (например: (A,B), (A,C), (B,D), (A,D)). Я хочу подсчитать градусы каждой вершины и отобразить ее так :MapReduce вопрос подсчета

(A,B) d(A)=3 
(A,C) d(A)=3 
(A,D) d(A)=3 
(A,B) d(B)=2 
(B,D) d(B)=2 
(A,C) d(C)=1 
(A,D) d(D)=2 
(B,D) d(D)=2 

на данный момент я был в состоянии сделать свою работу хорошо карты (расщепление 2 вершины и испускают <Key, Value> как <Vertex, Edge> (например: <A, (A,B)>), но сократить есть проблема, что я не могу понять, когда. Я делаю context.write(key, result); вне цикла for, результат отображается всегда 1. Я пытался отлаживать, но переменная sum имела правильное значение.

Сокращать

public void reduce(Text key, Iterable<Text> values, 
        Context context 
       ) throws IOException, InterruptedException { 
    int sum = 0; 
    for (Text val : values) { 
     sum+=1; 
     result.set("d("+ key +")=" + sum); 
     // WRITE INSIDE THE LOOP 
     context.write(key, result); 
    } 
} 

Результат:

A d(A)=1 
A d(A)=2 
A d(A)=3 
B d(B)=1 
B d(B)=2 
C d(C)=1 
D d(D)=1 
D d(D)=2 

Снижение v2:

public void reduce(Text key, Iterable<Text> values, 
        Context context 
       ) throws IOException, InterruptedException { 
    int sum = 0; 
    for (Text val : values) { 
     sum+=1; 
     result.set("d("+ key +")=" + sum); 
    } 
    // WRITE HERE NOW 
    context.write(key, result); 
} 

Результат v2:

A d(A)=1 
B d(B)=1 
C d(C)=1 
D d(D)=1 

Можете ли вы сказать мне, что неправильно с кодом или/и почему он ведет себя таким образом?

+0

где (и как) вы объявить 'result'? – vefthym

+1

Ваш код верен. Убедитесь, что вы используете последнюю версию runnable jar. Возможно, вы используете предыдущую версию своего кода. Скомпилируйте и снова сделайте банку. – vefthym

+0

@vefthym public static class IntSumReducer extends Reducer <Текст, текст, текст, текст> { \t private Текст result = new Текст(); Это просто атрибут Text для Reducer , и я использую eclipse, поэтому он генерирует новую банку каждый раз, когда я выполняю свой код. + Я попробовал в консольной версии (я думал, что в eclipse есть ошибка) и использовал правильные команды для создания флага и использовал его, но тот же результат ... – Didi

ответ

-1

Существует проблема как с кодовыми версиями Reducer. Вы можете пойти с v2, но с изменением. Извлеките этот result.set("d("+ key +")=" + sum); из цикла.

Используйте этот код:

public void reduce(Text key, Iterable<Text> values, 
        Context context 
       ) throws IOException, InterruptedException { 
    int sum = 0; 
    for (Text val : values) { 
     sum+=1; 
    } 
    result.set("d("+ key +")=" + sum); 
    // WRITE HERE NOW 
    context.write(key, result); 
} 
+0

результат написан в контексте и, очевидно, является Text, а не набором – AdamSkywalker

+0

Я уже пробовал эту и ту же проблему ... почему переменная sum сбрасывается до 1? – Didi

Смежные вопросы