我开发了一个运行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();
不要返回输入文件的名称 有什么指针吗?
答案 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();