非法字符((CTRL-CHAR,代码0))Map Reduce Combiner异常



我有一个Map-Reduce作业,它带有一个映射器,它接受一条记录并将其转换为一个对象,一个MyObject的实例,使用Jackson将其编组为JSON。该值只是记录中的另一个Text字段。

映射器的相关部分如下:

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: java.io.StringReader@5ae2bee7; line: 1, column: 3]
谁能告诉我这是什么原因?
  • 您可以使用Apache Commons库中的StringUtils来转义字符串。
  • 控件中的控制字符也可以选择性地替换

你也可以参考这篇文章:非法字符- CTRL-CHAR

我得到一个UTF-16编码的响应,在字节[]中的每个简单字符之后有一个((CTRL-CHAR,代码0)),见屏幕。

it work for me:

StringUtils.toEncodedString(responseBodyAsByteArray, StandardCharsets.UTF_16LE)

最新更新