0

基本的な質問かもしれませんが、map reduce プログラムでは、内容ではなく、inputfolder に存在するすべてのファイルの名前を読みたいと思います。それらのファイルの名前をマッパー クラスに送信したいと思います。設定 conf=new Configuration();

    Job job=new Job(conf,"Analysis");
    job.setInputFormatClass(KeyValueTextInputFormat.class);
    //Path pa =new Path("hdfs://localhost:54310/home/aparajith");
    //pa.

    FileInputFormat.addInputPath(job,new Path("/hduser/"));
    FileOutputFormat.setOutputPath(job, new Path("/CrawlerOutput23/"));

    job.setJarByClass(mapper.Mapper1.class);

    job.setMapperClass(mapper.Mapper1.class);
    job.setReducerClass(mapper.Reducer1.class);

    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(Text.class);
    System.exit(job.waitForCompletion(true) ? 0 : -1);

これは私のメインクラスであり、理解できないようです。

4

2 に答える 2

1

ファイルの名前が必要な場合は、キーと値がマッパーから取得されます。

マッパーでは、渡されたキーと値を単純に無視して (デフォルトでは、ファイル内の位置をLongWritableキーとして、行の内容をText値として)、次のようなことを行うことができます。

@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
    String fileName = ((FileSplit) context.getInputSplit()).getPath().getName();
    // insert remaining mapper logic here
}

これは、マッパーの現在のキーと値が読み取られたファイル名を取得します。


ディレクトリ内のファイル名だけをマッパーへの入力として使用する場合:

次のように、入力ディレクトリ ( ) 内のファイルを繰り返し処理し、ファイル名 ( )yourInputDirPathを含む新しいファイルを書き込むことができます。inputDirFilenamesPath

    FSDataOutputStream stream;
    try {
        stream = fs.create(inputDirFilenamesPath);
        RemoteIterator<LocatedFileStatus> it = fs.listFiles(yourInputDirPath, false);
        while (it.hasNext()) {
            stream.write(it.next().getPath().toString().getBytes());
            stream.write('\n');
        }
    } finally {
        stream.close();
    }

FileInputFormat.addInputPath(job, inputDirFilenamesPath);次に、このファイルを使用して、MR ジョブへの入力に追加するだけです。

于 2013-04-16T08:21:32.057 に答える
0

最も簡単な解決策は、そのディレクトリにあるファイルのすべての名前をファイルに入れ、そのファイルを入力ファイルとしてジョブに与えることです

于 2013-04-16T07:46:11.440 に答える