0

マップリデュースジョブを実行してFTPサーバーからファイルを読み取り、に書き込むコードを開発しましたHDFSHDFSこれに、FTPから指定された出力ディレクトリにファイルを書き込み、part-0000という名前を付けます。FTPサーバーに複数のファイルがある場合、それらすべてをその1つのpart-0000ファイルに書き込みますHDFS

これを回避するために、ファイルの名前をキーとして、データを値として渡す予定です。したがって、レデューサーは、ファイル名としてキーを使用してデータを出力ファイルに取り込みます。

outputformatを拡張するを使用する必要があることを理解していますMultipleTextOutputFormat。私はそれを次のように書きました

 static class MultiFileOutput extends MultipleTextOutputFormat<Text, Text> {

         protected String generateFileNameForKeyValue(Text key, Text value,String name) {
            System.out.println("key is :"+ key.toString());
         System.out.println("value is :"+ value.toString());
            System.out.println("name is :"+ name.toString());

                 return key.toString();
         }

しかし、処理中の入力ファイルの名前を渡すことができません。入力ファイルの名前を取得するにはどうすればよいですか?

map.input.file

FileSystem fs = file.getFileSystem(conf);
                String fileName=fs.getName();

入力ファイルの名前を返さないでください。
ポインタはありますか?

4

2 に答える 2

0

コンテキストを介して入力ファイルのパスを取得できます。

FileSplit fileSplit = (FileSplit) context.getInputSplit();
String inputFilePath = fileSplit.getPath().toString();

これにより、フルパスが提供されます。ファイル名だけが必要な場合は、次のように実行できます。

String inputFileName = fileSplit.getPath().getName();

HTH

于 2012-12-28T11:00:24.913 に答える
0

FileStatusカスタマイズした入力形式では入力ファイルが分割されないため、次のコードでオブジェクトを使用しました。それは私にとってはうまくいきました..

 FileSystem fs = file.getFileSystem(conf);
                    FileStatus status= fs.getFileStatus(file);
                    String fileName=status.getPath().toString();
于 2012-12-31T05:37:34.770 に答える