我正在尝试逐行读取hdfs文件,然后创建一个hdfs文件并逐行写入。我使用的代码如下所示:
Path FileToRead=new Path(inputPath);
FileSystem hdfs = FileToRead.getFileSystem(new Configuration());
FSDataInputStream fis = hdfs.open(FileToRead);
BufferedReader reader = new BufferedReader(new InputStreamReader(fis));
String line;
line = reader.readLine();
while (line != null){
String[] lineElem = line.split(",");
for(int i=0;i<10;i++){
MyMatrix[i][Integer.valueOf(lineElem[0])-1] = Double.valueOf(lineElem[i+1]);
}
line=reader.readLine();
}
reader.close();
fis.close();
Path FileToWrite = new Path(outputPath+"/V");
FileSystem fs = FileSystem.get(new Configuration());
FSDataOutputStream fileOut = fs.create(FileToWrite);
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(fileOut));
writer.write("check");
writer.close();
fileOut.close();
当我在 outputPath 文件中运行此代码时,尚未创建 V。但是,如果我将读取部分替换为写入部分,则会创建文件并将检查写入其中。谁能帮我理解如何正确使用它们以便能够先读取整个文件然后逐行写入文件?
我还尝试了另一种代码来读取一个文件并写入另一个文件,但该文件将被创建但没有写入任何内容!
我这样使用:
hadoop jar main.jar program2.Main input output
然后在我的第一份工作中,我使用 map reduce 类从 arg[0] 读取并写入 args[1]+"/NewV" 中的文件,并且它可以工作。在我的其他类(非 map reduce)中,我使用 args[1]+"/NewV" 作为输入路径,使用 output+"/V_0" 作为输出路径(我将这些字符串传递给构造函数)。这是该类的代码:
public class Init_V {
String inputPath, outputPath;
public Init_V(String inputPath, String outputPath) throws Exception {
this.inputPath = inputPath;
this.outputPath = outputPath;
try{
FileSystem fs = FileSystem.get(new Configuration());
Path FileToWrite = new Path(outputPath+"/V.txt");
Path FileToRead=new Path(inputPath);
BufferedWriter output = new BufferedWriter
(new OutputStreamWriter(fs.create(FileToWrite,
true)));
BufferedReader reader = new
BufferedReader(new InputStreamReader(fs.open(FileToRead)));
String data;
data = reader.readLine();
while ( data != null )
{
output.write(data);
data = reader.readLine();
}
reader.close();
output.close(); }catch(Exception e){
}
}
}