2016-08-02 3 views
0

hazelcast 3.6.1을 사용하고 맞춤형 mapreduce를 사용하여 고유 한 집계 기능을 구현하여 solr 패싯 유형의 결과를 얻습니다.Custom Dstinct Mapper의 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); 
     } 
    } 
} 

mapper가 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의 매퍼 코드에서 일시적인 효과가 있습니까? –

답변

1

entry 필드가 일시적입니다. 이것은 serialize되지 않았 음을 의미하므로 DistinctMapper 객체가 hazecalst 노드에서 deserialize 될 때 값은 null입니다. 과도 현상을 제거하면 NullPointerException가 해결됩니다.

쪽지 : 왜이 입력란이 필요합니까? 어떤 용도로 사용하지 않는 것 같습니다.

+0

나는 일시적인 것을 제거하고 일했다. 공급 업체를 적용하는 데 필요한 입력 필드 내가 hazelcast DistinctValueMapper DistinctValuesAggregation.java 코드 자체에서 일시적으로 참조하십시오. 그래서 직렬화를 무효화하면 무언가를 절약 할 수 있습니다. 왜 일시적으로 사용해야 할 이유가 있습니까? –

+0

@AnilDasari 임시 변통을 사용하는 데에는 몇 가지 이유가 있습니다. 자세한 내용은 Java 직렬화에 대해 읽어 보시기 바랍니다 : http://stackoverflow.com/documentation/java/767/serialization#t=201608040938312782102. 그러나'DistinctValueMapper'에 대한 여러분의 질문에 답하기 위해'AggregationsDataSerializerHook'에서 볼 수있는 것처럼 기본 자바 직렬화를 사용하지 않고 커스텀 인터럽트를 사용합니다. 'DistinctValueMapper'는'readObject' 메소드 대신에'new' 연산자를 사용하여 만들어 지므로,'entry' 필드가 제대로 초기화됩니다. – noscreenname