将MapReduce作业的part-0000文件命名为hadoop中输入文件的文件

时间:2012-12-28 08:43:50

标签: hadoop mapreduce

我开发了一个运行map reduce作业的代码,用于从FTP服务器读取文件并将其写入HDFS。进入HDFS,它将文件从FTP写入指定的输出目录,并将其命名为part-0000。如果我在FTP服务器上有多个文件,我会将它们全部写入HDFS中的一个part-0000文件。

为避免这种情况,我计划将文件名作为键传递,并将数据作为值传递。因此,reducer将数据输入到输出文件中,并将密钥作为文件名。

我知道我必须使用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();

不要返回输入文件的名称 有什么指针吗?

2 个答案:

答案 0 :(得分:0)

您可以通过上下文获取输入文件路径。

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

这将给出完整的路径。如果你只想要文件名,你可以这样做:

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

HTH

答案 1 :(得分:0)

我在以下代码中使用了FileStatus对象,因为我的自定义输入格式不会拆分输入文件。它对我来说很好..

 FileSystem fs = file.getFileSystem(conf);
                    FileStatus status= fs.getFileStatus(file);
                    String fileName=status.getPath().toString();