这可能是一个基本问题,但在map reduce程序中,我想读取input文件中存在的所有文件的名称而不是内容,我想将这些文件的名称发送到我的mapper类。 配置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);
这是我的主要课程,我似乎无法弄明白。
答案 0 :(得分:0)
最简单的解决方案是将该目录中的所有文件名放在一个文件中,并将该文件作为输入文件提供给作业
答案 1 :(得分:0)
在您的映射器中,您可以忽略传入的键和值(默认情况下,文件中的位置为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作业的输入中。