hadoop映射器输入处理十六进制值

时间:2017-04-14 04:19:53

标签: java string hadoop unicode utf-8

我有推文列表作为hdfs的输入,并尝试执行map-reduce任务。这是我的映射器实现:

@Override
public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
  try {
    String[] fields = value.toString().split("\t");
    StringBuilder sb = new StringBuilder();
    for (int i = 1; i < fields.length; i++) {
      if (i > 1) {
        sb.append("\t");
      }
      sb.append(fields[i]);
    }
    tid.set(fields[0]);
    content.set(sb.toString());
    context.write(tid, content);
  } catch(DecoderException e) {
    e.printStackTrace();
  }
}

正如您所看到的,我尝试将输入拆分为&#34; \ t&#34;,但输入(value.toString())在打印出来时看起来像这样:

2014\x091880284777\x09argento_un\x090\x090\x09RT @topmusic619: #RETWEET THIS!!!!!\x5CnFOLLOW ME &amp
; EVERYONE ELSE THAT RETWEETS THIS FOR 35+ FOLLOWERS\x5Cn#TeamFollowBack #Follow2BeFollowed #TajF\xE2\x80\xA6

这是另一个例子:

2014\x0934447260\x09RBEKP\x090\x090\x09\xE2\x80\x9C@LENEsipper: Wild lmfaooo RT @Yerrp08: L**o some
 n***a nutt up while gettin twerked

我注意到\x09应该是制表符(ASCII 09是制表符),所以我尝试使用apache Hex

    String tmp = value.toString();
    byte[] bytes = Hex.decodeHex(tmp.toCharArray());

但是decodeHex函数返回null。

这很奇怪,因为有些字符是十六进制而另一些则不是。我怎么解码它们?

编辑: 另请注意,除了tab之外,emojis也会被编码为十六进制值。

0 个答案:

没有答案