У меня есть работа по сокращению карты с помощью mapper, которая берет запись и преобразует ее в объект, экземпляр MyObject, который сортируется в JSON с помощью Jackson. Это просто другое текстовое поле в записи.
Соответствующий фрагмент устройства отображения выглядит примерно так:
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());
Выходы обработчика отправляются в комбайнер, который отключает объект JSON и объединяет пары ключ-значение. Это концептуально очень просто и что-то вроде:
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)
}
Класс MyObject состоит из двух полей (обе строки), методов get/set и конструктора по умолчанию. В одном из полей хранятся фрагменты текста на основе веб-обхода, но всегда это строка.
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;
}
}
Моя работа MapReduce работает нормально до тех пор, пока не достигнет определенных записей, к которым я не могу легко получить доступ (потому что картограф генерирует записи из обхода), и возникает следующее исключение:
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]
Есть ли у кого-нибудь какие-либо предложения относительно причины этого?