2016-08-02 1 views
0

J'utilise Hazelcast 3.6.1 et implémente des fonctionnalités agrégées distinctes en utilisant mapreduce personnalisé pour obtenir des résultats de type facette.NullPointerException dans Custom Dstinct Mapper

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); 
     } 
    } 
} 

et mapper échoue avec NullPointerException. et l'instruction sysout indique que l'objet d'entrée est null.

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

Pouvez-vous me rappeler la question dans le code ci-dessus? Merci.

+0

Y at-il un avantage de transitoire dans le code du mappeur en noisette? –

Répondre

1

entry champ est transitoire. Cela signifie qu'il n'est pas sérialisé, donc lorsque l'objet DistinctMapper est désérialisé sur un noeud hazecalst, sa valeur est null. Suppression du transitoire résoudra le NullPointerException.

Sur la note de côté: Pourquoi avez-vous besoin de ce champ de saisie? Cela ne semble pas avoir d'utilité.

+0

J'ai enlevé transitoire et travaillé. champ de saisie requis pour appliquer le fournisseur. Je vois transitoire dans le code distinct DistinctValueMapper DistinctValuesAggregation.java lui-même. annuler la sérialisation permettrait d'économiser quelque chose. est il raison d'utiliser transitoire –

+0

@AnilDasari Il ya plusieurs raisons d'utiliser transitoire, je vous invite à lire sur la sérialisation Java pour plus de détails: http://stackoverflow.com/documentation/java/767/serialization#t=201608040938312782102. Mais pour répondre à votre question sur 'DistinctValueMapper', il n'utilise pas la sérialisation java par défaut, mais une version personnalisée, comme on peut le voir dans' AggregationsDataSerializerHook'. Un 'DistinctValueMapper' est créé en utilisant l'opérateur' new' à la place de la méthode 'readObject', donc le champ' entry' est lancé correctement. – noscreenname