Что именно является выходом функции картографа и редуктора

Это дополнительный вопрос Извлечение строк, содержащих определенное значение, с использованием mapReduce и hadoop
функция Mapper

public static class MapForWordCount extends Mapper<Object, Text, Text, IntWritable>{

private IntWritable saleValue = new IntWritable();
private Text rangeValue = new Text();

public void map(Object key, Text value, Context con) throws IOException, InterruptedException
{
    String line = value.toString();
    String[] words = line.split(",");
    for(String word: words )
    {
        if(words[3].equals("40")){  
            saleValue.set(Integer.parseInt(words[0]));
            rangeValue.set(words[3]);
            con.write( rangeValue , saleValue );
        }
    }
}   
}

Функция редуктора

public static class ReduceForWordCount extends Reducer<Text, IntWritable, Text, IntWritable>  
{  
    private IntWritable result = new IntWritable();  
    public void reduce(Text word, Iterable<IntWritable> values, Context con) throws IOException, InterruptedException  
    {  
        for(IntWritable value : values)  
        {  
            result.set(value.get());  
            con.write(word, result);  
        }  
    }  
}

Полученный результат

40 105  
40 105  
40 105  
40 105

EDIT 1: Но ожидаемый результат

40 102  
40 104  
40 105

Что я делаю неправильно?

Что именно здесь происходит в функциях картографа и редуктора?


person user6119874    schedule 07.05.2016    source источник
comment
Вы выписываете пары "ключ-значение"... Что еще вы хотите знать?   -  person OneCricketeer    schedule 07.05.2016
comment
Спасибо за предложение @cricket_007, я обязательно попробую это ... Я действительно хотел знать, что ТОЧНО возвращает маппер, а редуктор - принимает и печатает.   -  person user6119874    schedule 07.05.2016
comment
когда вы extends их, порядок <KeyIn, ValueIn, KeyOut, ValueOut> для обоих классов. Выходные пары "ключ-значение" преобразователя должны совпадать с входными ключами-значениями редуктора.   -  person OneCricketeer    schedule 07.05.2016
comment
@cricket_007 Хорошо ... Итак, что в моем случае возвращает карта (не картограф) ... например, 40 105 40 105 40 105 ? или что-то другое ? Пожалуйста, проверьте редактирование, которое я сделал в вопросе.   -  person user6119874    schedule 07.05.2016
comment
Это void, так что ничего не возвращается, но редюсер читает (40, [105, 105, 105])   -  person OneCricketeer    schedule 07.05.2016
comment
Чтобы дать дополнительную информацию: Mappers записывают значения в редюсер (и не возвращают), используя объект контекста, а редукторы выдают значения на выходе (опять же, используя контекст, а не возвращая). преобразователи отправляют все значения с одним и тем же ключом в один и тот же редуктор (на самом деле это происходит на этапе перемешивания), поэтому каждый редуктор затем будет работать с набором значений с одним и тем же ключом.   -  person It-Z    schedule 08.05.2016
comment
Спасибо @It-Z, это именно то, что я искал.   -  person user6119874    schedule 25.05.2016


Ответы (3)


В контексте исходного вопроса - вы не не нужен цикл ни в картографе, ни в редукторе, поскольку вы дублируете записи:

public static class MapForWordCount extends Mapper<Object, Text, Text, IntWritable>{

private IntWritable saleValue = new IntWritable();
private Text rangeValue = new Text();

public void map(Object key, Text value, Context con) throws IOException, InterruptedException
{
    String line = value.toString();
    String[] words = line.split(",");
    if(words[3].equals("40")){  
       saleValue.set(Integer.parseInt(words[0]));
       rangeValue.set(words[3]);
       con.write(rangeValue , saleValue );
    }
}   
}

А в редюсере, как предложил @Serhiy в исходном вопросе, вам нужна только одна строка кода:

public static class ReduceForWordCount extends Reducer<Text, IntWritable, Text, IntWritable>  
{  
private IntWritable result = new IntWritable();  
public void reduce(Text word, Iterable<IntWritable> values, Context con) throws IOException, InterruptedException  
{  
    con.write(word, null);  
} 

Переоценка "Edit 1" - оставлю это тривиальной практикой :)

person It-Z    schedule 07.05.2016
comment
Вы можете обратиться к ответу @cricket_007 относительно способа дублирования записей. - person It-Z; 07.05.2016

Что именно происходит

Вы потребляете строки текста с разделителями-запятыми, разделяете запятые и отфильтровываете некоторые значения. con.write() следует вызывать только один раз на строку, если все, что вы делаете, это извлечение только этих значений.

Преобразователь сгруппирует все «40» ключей, которые вы выведете, и сформирует список всех значений, которые были записаны с этим ключом. И это то, что считывает редуктор.

Вероятно, вам следует попробовать это для вашей функции карты.

// Set the values to write 
saleValue.set(Integer.parseInt(words[0]));
rangeValue.set(words[3]);

// Filter out only the 40s
if(words[3].equals("40")) {
    // Write out "(40, safeValue)" words.length times 
    for(String word: words )
    {
        con.write( rangeValue , saleValue );
    }
}

Если вам не нужны повторяющиеся значения длины разделяемой строки, избавьтесь от цикла for.

Все, что делает ваш редьюсер, — это просто распечатывает то, что он получил от маппера.

person OneCricketeer    schedule 07.05.2016

Вывод Mapper будет примерно таким:

<word,count>

Выход редуктора будет таким:

<unique word, its total count>

Например: строка прочитана, все слова в ней подсчитаны и помещены в пару <key,value>:

<40,1>
<140,1>
<50,1>
<40,1> ..

здесь 40,50,140, ​​.. — все ключи, а значение — количество вхождений этого ключа в строке. Это происходит в маппере.

Затем эти key,valueпары отправляются редуктору, где все похожие ключи сокращаются до одного key, и все значения, связанные с этим ключом, суммируются, чтобы получить значение пары ключ-значение. Итак, результат редуктора будет примерно таким:

<40,10>
<50,5>
...

В вашем случае редуктор ничего не делает. Уникальные значения/слова, найденные картографом, просто выдаются в качестве вывода.

В идеале вы должны уменьшить и получить вывод, например: «40 150» было найдено 5 раз в одной строке.

person Ani Menon    schedule 07.05.2016