1

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

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() 之外,这个问题还有其他选择吗

4

2 回答 2

1

您可以使用 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
    }
}

免责声明:完全未经测试

于 2012-07-24T00:55:48.140 回答
1

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

于 2012-07-24T04:04:17.277 回答