map reduce组合器中出现非法字符((ctrl char,代码0))异常

vqlkdk9b  于 2021-06-04  发布在  Hadoop
关注(0)|答案(1)|浏览(577)

我有一个MapReduce作业,它使用一个Map器获取一个记录并将其转换为一个对象,一个myobject的示例,该示例使用jackson封送到json。值只是记录中的另一个文本字段。
Map器的相关部分如下所示:

  1. ObjectMapper mapper = new ObjectMapper();
  2. MyObject val = new MyObject();
  3. val.setA(stringA);
  4. val.setB(stringB);
  5. Writer strWriter = new StringWriter();
  6. mapper.writeValue(strWriter, val);
  7. key.set(strWriter.toString());

Map器的输出被发送到一个组合器,该组合器解组json对象并聚合键值对。它在概念上非常简单,类似于:

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

myobject类由两个字段(都是字符串)、get/set方法和一个默认构造函数组成。其中一个字段存储基于web爬网的文本片段,但始终是字符串。

  1. public class MyObject {
  2. private String A;
  3. private String B;
  4. public MyObject() {}
  5. public String getA() {
  6. return A;
  7. }
  8. public void setA(String A) {
  9. this.A = A;
  10. }
  11. public String getB() {
  12. return B;
  13. }
  14. public void setIdx(String B) {
  15. this.B = B;
  16. }
  17. }

我的mapreduce作业似乎运行良好,直到它到达某些记录为止,我无法轻松访问这些记录(因为Map程序正在通过爬网生成记录),并引发以下异常:

  1. Error: com.fasterxml.jackson.core.JsonParseException:
  2. Illegal character ((CTRL-CHAR, code 0)): only regular white space (\r, \n, \t) is allowed between tokens
  3. at [Source: java.io.StringReader@5ae2bee7; line: 1, column: 3]

有人对这件事的起因有什么建议吗?

btqmn9zl

btqmn9zl1#

您可以使用apache commons中的stringutils来转义字符串-https://commons.apache.org/proper/commons-lang/javadocs/api-2.6/src-html/org/apache/commons/lang/stringescapeutils.html#line.89
或者可以在json封送处理之前有选择地替换字符串中的控制字符。
您还可以引用这个post-非法字符-ctrl char

相关问题