2016-08-02 68 views
0

我使用hazelcast 3.6.1并使用自定义mapreduce实现不同的聚合功能以获得solr facet种类的结果。自定义Dstinct映射器中的NullPointerException

public class DistinctMapper implements Mapper<String, Employee, String, Long>{ 

    private transient SimpleEntry<String, Employee> entry = new SimpleEntry<String, Employee>(); 

    private static final Long ONE = Long.valueOf(1L); 

    private Supplier<String, Employee, String> supplier; 

    public DistinctMapper(Supplier<String, Employee, String> supplier) { 
     this.supplier = supplier; 
    } 

    @Override 
    public void map(String key, Employee value, Context<String, Long> context) { 
     System.out.println("Object "+ entry + " and key "+key); 
     entry.setKey(key); 
     entry.setValue(value); 
     String fieldValue = (String) supplier.apply(entry); 
     //getValue(value, fieldName); 
     if (null != fieldValue){ 
      context.emit(fieldValue, ONE); 
     } 
    } 
} 

和映射程序与NullPointerException失败。而sysout声明表示入口对象为空。

SimpleEntry:https://github.com/hazelcast/hazelcast/blob/v3.7-EA/hazelcast/src/main/java/com/hazelcast/mapreduce/aggregation/impl/SimpleEntry.java

你能指出我在上面的代码中的问题?谢谢。

+0

在hazelcast中的mapper代码中是否有任何优势? –

回答

1

entry字段是暂时的。这意味着它不是序列化的,所以当DistinctMapper对象在hazecalst节点上反序列化时,它的值为null。 删除瞬态将解决NullPointerException

旁边注: 为什么你需要这个输入字段?它似乎没有任何用处。

+0

我删除了瞬态并工作。应用供应商所需的输入字段。我在hazelcast DistinctValueMapper DistinctValuesAggregation.java代码中看到瞬态。所以排除序列化会节省一些东西。是否有理由使用瞬态 –

+0

@AnilDasari有几个原因使用瞬态,我邀请您阅读Java序列化的详细信息:http://stackoverflow.com/documentation/java/767/serialization#t=201608040938312782102。但是要回答你有关'DistinctValueMapper'的问题,它不使用默认的Java序列化,而是使用自定义的序列化,这可以在'AggregationsDataSerializerHook'中看到。 'DistinctValueMapper'是使用'new'运算符而不是'readObject'方法创建的,因此'entry'字段被正确启动。 – noscreenname