无法标记文件数据



我是hadoop和mapreduce的新手。在mapper中,我将用以下给定格式的文本文件中的前几行标记这些数据

9593C58F7C1C5CE4    970916072134    levis
9593C58F7C1C5CE4    970916072311    levis strause & co
9593C58F7C1C5CE4    970916072339    levis 501 jeans
45531846E8E7C127    970916065859    
45531846E8E7C127    970916065935    
45531846E8E7C127    970916070105    "brazillian soccer teams"
45531846E8E7C127    970916070248    "brazillian soccer"
45531846E8E7C127    970916071154    "population of maldives"
082A665972806A62    970916123431    pegasus
F6C8FFEAA26F1778    970916070130    "alicia silverstone" cutest crush batgirl babysitter clueless 
945FF0D5996FD556    970916142859    mirc

使用String Tokenizer,我无法分割这些数据,它会混淆机器从这个文件中捕获数据。除了String.split()

之外,还有其他方法可以解决这个问题吗

@Hanry:为什么不使用相同的javaStringTokenizer呢。您所要做的就是标记化wrt空间,获得总标记计数,然后迭代并使用第一个和第二个标记,并将后续标记连接到第三个字符串中。

您可以使用TextInputFormat一次给每一行,如果它真的是固定宽度格式,并且您有恒定数量的字段(3),那么您可以执行以下操作:

Text token1 = new Text();
Text token2 = new Text();
Text token3 = new Text();
protected void map(LongWritable key, Text value, Context context) {
    // 0123456789012345678901234567890123456789
    //           1         2         3
    // 9593C58F7C1C5CE4    970916072134    levis
    if (value.getLength() >= 37) {
      token1.set(value.getBytes(), 0, 16);
      token2.set(value.getBytes(), 20, 12);
      token3.set(value.getBytes(), 26, value.getLength() - 26);
      // TOFO: Do something with these tokens
    } else {
      // TODO: handle bad record length
    }
}

免责声明:完全未经测试的

相关内容

  • 没有找到相关文章

最新更新