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 スペースをトークン化し、合計トークン数を取得してから、最初と 2 番目のトークンを反復して使用し、後続のトークンを 3 番目の文字列に連結することだけです。

于 2012-07-24T04:04:17.277 に答える