Вы не можете вернуть подкласс класса, который был определен в конфигурации, потому что Hadoop явно проверяет тип класса, указанный в setMapOutputValueClass
, и тип, который он получает от Mappers.
Это происходит потому, что ему нужно сериализовать / десериализовать объекты, которые вы излучаете из картографов. Когда он выполняет десериализацию, он создает новый объект типа, указанного в вызове setMapOutputValueClass
, а затем использует методы интерфейса WriteableComparable для заполнения вновь созданного объекта данными.
Чтобы иметь возможность испускать разные типы объектов, вы можете определить контейнерный неабстрактный класс и поместить фактический объект и идентификатор его типа внутрь
public enum ELEM_TYPE { WE, WECONTAINER }
public class Container implements WritableComparable<Container>
{
ELEM_TYPE type; //actual element type -
// WeightedEdge or NodeWeightContainer
object value;
//WritableComparable implementation
// that casts value to the appropriate type
}
public class WeightedEdge { ... }
public class NodeWeightContainer { ... }