Ho un lavoro Map-Reduce con un mapper che prende un record e lo converte in un oggetto, un'istanza di MyObject, che è inviato a JSON usando Jackson. Il valore è solo un altro campo di testo nel record.Strange Jackson Carattere non valido ((CTRL-CHAR, codice 0)) Eccezione in Map Reduce Combiner
Il pezzo rilevante del mappatore è simile al seguente:
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());
Le uscite del mappatore vengono inviati ad un combinatore che unmarshalls l'oggetto JSON e aggrega coppie di valori-chiave. E 'concettualmente molto semplice ed è qualcosa di simile:
classepublic 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 MyObject è costituito da due campi (entrambe le stringhe), ricevere/metodi set e un costruttore di default. Uno dei campi memorizza frammenti di testo basati su una scansione Web, ma è sempre una stringa.
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;
}
}
Il mio lavoro MapReduce sembra funzionare benissimo fino a raggiungere alcuni record, che non posso facilmente accesso (perché il mapper sta generando i record da un crawl), e viene gettata la seguente eccezione:
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]
Qualcuno avrebbe qualche suggerimento sulla causa di questo?
Usa okhttp 1.5.1. Spero che risolva il tuo problema. – SkyWalker
Mi rendo conto che hai detto che non hai un accesso facile ma ti suggerisco di terminare la ricerca per indicizzazione e rimuovere i caratteri di controllo spuri come 0 (NULL) dallo stream e poi passarlo a Jackson. Ho visto feed finanziari per vari titoli avere dati spuri come questo che devono sempre essere abbattuti. Molto probabilmente è un difetto sul lato mittente. – sagneta
A livello basso qualcosa sta iniettando byte null (byte 0) nello stream e il parser non li accetta (non sono validi per JSON). Devi capire come e perché questo accade; potrebbe essere molte cose tra cui problemi di concorrenza o tempistiche (cercando di analizzare il contenuto prima che venga caricato nel buffer). – StaxMan