私はMap-Reduceジョブを使用していて、レコードを取得して、それをオブジェクト(Jacksonを使用してJSONにマーシャリングされるMyObjectのインスタンス)に変換するマッパーを使用しています。値は、レコード内の別のテキストフィールドです。
マッパーの関連部分は次のようなものです。
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オブジェクトを非整列化し、キーと値のペアを集約するCombinerに送信されます。概念的には非常にシンプルで、次のようなものです。
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クラスは、2つのフィールド(両方の文字列)、get/setメソッド、およびデフォルトのコンストラクターで構成されます。フィールドの1つは、Webクロールに基づいてテキストのスニペットを格納しますが、常に文字列です。
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を使用して文字列をエスケープできます- https://commons.Apache.org/proper/commons-lang/javadocs/api-2.6/src-html/org/Apache/commons/lang/ StringEscapeUtils.html#line.89
または、jsonマーシャリングの前に文字列から制御文字を選択的に置き換えることができます。
この投稿を参照することもできます- 無効な文字-CTRL-CHAR