我对Hadoop环境很新。最近,我运行了一个基本的mapreduce程序。它很容易运行。
现在,我在输入路径目录
中有一个包含以下内容的输入文件fileName1
fileName2
fileName3
...
我需要逐个读取这个文件的行,并在指定的输出目录下创建一个带有这些名称的新文件(即fileName1,fileName2等)。
我写了下面的地图实现,但它没有用完
public void map(LongWritable key, Text value, OutputCollector<Text, IntWritable> output, Reporter reporter)
throws IOException {
String fileName = value.toString();
String path = outputFilePath + File.separator + fileName;
File newFile = new File(path);
newFile.mkdirs();
newFile.createNewFile();
}
有人能解释我错过了什么吗?
由于
答案 0 :(得分:0)
我认为你应该开始研究 FileSystem 类,我认为你只能在分布式文件系统中创建文件。这是我打开文件进行读取的代码示例,您可能只需要一个FSDataOutputStream。在映射器中,您可以从Context类中获取配置。
Configuration conf = job.getConfiguration();
Path inFile = new Path(file);
try {
FileSystem fs;
fs = FileSystem.get(conf);
if (!fs.exists(inFile))
System.out.println("Unable to open settings file: "+file);
FSDataInputStream in = fs.open(inFile);
...
}
答案 1 :(得分:0)
首先在 FileSplit 的帮助下获取mapper中输入目录的路径。然后将其附加到包含所有这些行的文件名,并使用 FSDataInputStream 读取此文件的行。像这样:
public void map(Object key, Text value, Context context)
throws IOException, InterruptedException {
FileSplit fileSplit = (FileSplit)context.getInputSplit();
FileSystem fs = FileSystem.get(context.getConfiguration());
FSDataInputStream in = fs.open(new Path(fileSplit.getPath().getParent() + "/file.txt"));
while(in.available() > 0){
FSDataOutputStream out = fs.create(new Path(in.readLine()));
}
//Proceed further....
}