2014-07-18 1 views
20

J'ai un travail Map-Reduce avec un mappeur qui prend un enregistrement et le convertit en objet, une instance de MyObject, qui est marshalled à JSON en utilisant Jackson. La valeur est juste un autre champ de texte dans l'enregistrement.Strange Jackson Caractère illégal ((CTRL-CHAR, code 0)) Exception dans la carte Réduire le combinateur

La pièce correspondante du mappeur est quelque chose comme ce qui suit:

ObjectMapper mapper = new ObjectMapper(); 
MyObject val = new MyObject(); 
val.setA(stringA); 
val.setB(stringB); 
Writer strWriter = new StringWriter(); 
mapper.writeValue(strWriter, val); 
key.set(strWriter.toString()); 

Les sorties du mappeur sont envoyés à un combineur qui unmarshalls l'objet JSON et agrégats paires clé-valeur. Il est conceptuellement très simple et est quelque chose comme:

public void reduce(Text key, Iterable<IntWritable> values, Context cxt) 
    throws IOException, InterruptedException { 
    int count = 0; 
    TermIndex x = _mapper.readValue(key.toString(), MyObject.class); 
    for (IntWritable int : values) ++count; 
    ... 
    emit (key, value) 
} 

La classe MyObject se compose de deux champs (les deux cordes), les méthodes get/set et un constructeur par défaut. L'un des champs stocke des extraits de texte basés sur une analyse Web, mais est toujours une chaîne.

public class MyObject { 
    private String A; 
    private String B; 

    public MyObject() {} 

    public String getA() { 
    return A; 
    } 
    public void setA(String A) { 
    this.A = A; 
    } 
    public String getB() { 
    return B; 
    } 
    public void setIdx(String B) { 
    this.B = B; 
    } 
} 

Mon travail MapReduce semble fonctionner très bien jusqu'à ce qu'il atteigne certains documents, que je ne peux pas facilement accès (parce que le mappeur génère les enregistrements d'une analyse), et est Jeté l'exception suivante:

Error: com.fasterxml.jackson.core.JsonParseException: 

    Illegal character ((CTRL-CHAR, code 0)): only regular white space (\r, \n, \t) is allowed between tokens 
    at [Source: [email protected]; line: 1, column: 3] 

Quelqu'un aurait-il des suggestions sur la cause de cela?

+0

Utilisez okhttp 1.5.1. J'espère que cela va résoudre votre problème. – SkyWalker

+1

Je me rends compte que vous avez dit que vous n'avez pas un accès facile, mais je suggère avant de terminer l'exploration et de supprimer les caractères de contrôle parasites comme 0 (NULL) du flux, puis le passer à jackson. J'ai vu des flux financiers pour divers titres ont des données fausses comme cela qui doit toujours être éliminé. C'est probablement un défaut du côté de l'envoi. – sagneta

+0

Au niveau bas, quelque chose injecte des octets nuls (octet 0) dans le flux et l'analyseur ne les accepte pas (ils ne sont pas valides pour JSON). Vous devez comprendre comment et pourquoi cela se produit; il peut y avoir beaucoup de choses, y compris des problèmes de simultanéité, ou de synchronisation (en essayant d'analyser le contenu avant qu'il ne soit chargé dans le tampon). – StaxMan

Répondre

Questions connexes