Java Hadoop映射任务:读取指定输入文件的内容
我对Hadoop环境相当陌生。最近,我运行了一个基本的mapreduce程序。它很容易跑 现在,我在输入路径目录中有一个包含以下内容的输入文件Java Hadoop映射任务:读取指定输入文件的内容,java,hadoop,mapreduce,cloudera,hadoop-partitioning,Java,Hadoop,Mapreduce,Cloudera,Hadoop Partitioning,我对Hadoop环境相当陌生。最近,我运行了一个基本的mapreduce程序。它很容易跑 现在,我在输入路径目录中有一个包含以下内容的输入文件 fileName1 fileName2 fileName3 ... 我需要一行一行地读取这个文件,并在指定的输出目录中创建一个具有这些名称(即fileName1、fileName2等)的新文件 我编写了下面的映射实现,但没有成功 public void map(LongWritable key, Text value, OutputCollector&
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();
}
公共void映射(可长写键、文本值、OutputCollector输出、Reporter)
抛出IOException{
字符串文件名=value.toString();
字符串路径=outputFilePath+File.separator+文件名;
File newFile=新文件(路径);
newFile.mkdirs();
createNewFile();
}
有人能解释一下我错过了什么吗
谢谢我认为您应该开始学习文件系统类,我认为您只能在分布式文件系统中创建文件。这里有一个代码示例,我打开了一个文件进行读取,您可能只需要一个FSDataOutputStream。在映射器中,可以从上下文类中获取配置
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);
...
}
首先,借助FileSplit获取映射器中输入目录的路径。然后将其附加到包含所有这些行的文件名中,并使用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....
}
请阅读MR/Hadoop的基础知识,进行一些练习并发布一个查询。@PraveenSripati:请告诉我需要在这里做什么。..FSDataInputStream不推荐使用。您必须使用BufferedReader。(请参阅DataInputStream中的更多信息)