Конфликт имени getPartition типа Partitioner имеет такое же стирание основного класса типа в MapReduce, Hadoop

Я пытался написать код, который я могу настроить. Ввод будет поступать в редуктор в соответствии с длиной символа, используя реализацию в разделе, где по умолчанию Mapper и Reducer, но возникает следующая ошибка. Я буду благодарен тому, кто мне поможет.

Ошибка в int setNumRedTasks):

Конфликт имен: метод getPartition(Object, Object, int) типа MyPartitioner имеет то же стирание, что и getPartition(K2, V2, int) типа Partitioner, но не переопределяет его.

Код:

package partition;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.mapred.Partitioner;

public abstract class MyPartitioner implements Partitioner<Text, IntWritable>{

    @Override
    public void configure(JobConf arg0) {
        // TODO Auto-generated method stub

    }
    // @Override
    public int getPartition(Object key, Object value, int setNumRedTasks) {
        String s = key.toString();
        if(s.length()==1)
        {
            return 0;
        }

        if(s.length()==2)
        {
            return 1;
        }

        if(s.length()==3)
        {
            return 2;
        }
        else
            return 3;


    }
}

person Community    schedule 30.08.2017    source источник


Ответы (1)


Ваша подпись метода getPartition неверна, она должна быть:

public int getPartition(Text key, IntWritable value, int setNumRedTasks) {
    ... Code goes here
}

Этот ответ SO объясняет, что означает ошибка стирания: то же стирание, что и другой метод типа

Фактически, поскольку вы использовали Object вместо универсальных типов, невозможно определить, какую версию использовать, они эквивалентны.

person Binary Nerd    schedule 30.08.2017