8

Hadoop 1.0.1 を使用していくつかのプロジェクトを実行し、入力 .txt ファイルを次のように必要な「キー」と「値」にしたいと考えています。

ファイルがtest.txtあり、ファイルの内容が

1、10 10

「KeyValueTextInputFormat」を使って「,」を区切り記号にすれば、入力後はキー「1」「10 10」になると思います。

しかし、私が得た結果は、すべての情報がキーであり、値が空です。どこに問題があるのか​​わからない。

助けてください、ありがとう!

これはコード例です:

public class WordCount{
    public class WordCountMapper extends Mapper<Text, Text, Text, Text>{  

        public void map(Text key, Text value, Context context) throws IOException, InterruptedException {
            context.write(value, value);
            context.write(key, key);
        }   
      }
    public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();
        conf.set("key.value.separator.in.input.line",",");
        String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
        if (otherArgs.length != 2) {
          System.err.println("Usage: wordcount <in> <out>");
          System.exit(2);
        }
        Job job = new Job(conf, "word count");
        job.setJarByClass(WordCount.class);
        job.setMapperClass(WordCountMapper.class);
        job.setInputFormatClass(KeyValueTextInputFormat.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(Text.class);
        KeyValueTextInputFormat.addInputPath(job, new Path(otherArgs[0]));
        FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
        System.exit(job.waitForCompletion(true) ? 0 : 1);
      }
}
4

4 に答える 4

1

区切り文字は属性名の下に指定できますmapreduce.input.keyvaluelinerecordreader.key.value.separator。デフォルトの区切り文字はタブ文字('\t')です。したがって、あなたの場合、行conf.set("key.value.separator.in.input.line",",");
を次のように変更します

conf.set("mapreduce.input.keyvaluelinerecordreader.key.value.separator",",");

そして、それはトリックを行う必要があります

于 2014-05-28T08:57:14.127 に答える
0

KeyValueTextInputFormatキーと値の間にタブがある場合はキーと値を取得しようとしましたが、そうでない場合は行全体をキーとして取得し、値は何もありません。

1 10,10そのため、代わりに使用する必要があります1, 10 10

于 2014-01-25T09:37:52.007 に答える
-1

入力ファイルはキーと値のペアに変換され、そのようなすべてのペアに対して map 関数が呼び出されます。あなたの例の場合、マップへの入力は何らかのキーになり(ファイルの行番号であるため、おそらく1になります)、最も重要なのは、値が1,10 10になることです。

これで、マッパーからのすべての出力をスワップおよびソートした後にのみ、リデューサー クラスの reduce 関数に送られるマッパーから何でも出力できます。

したがって、マッパーから context.write(value) を出力し、リデューサーから同じものを出力すると、すべてのファイルから一意の行が取得されます。

私はあなたが何を望んでいるかを説明していないと思いますが、これはHadoop Map-Reduceで起こる基本的なことです.

于 2012-09-24T12:12:17.570 に答える