Я пытаюсь читать из файла 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
Затем в моей первой работе я читаю из arg[0] и записываю в файл в args[1]+"/NewV" с использованием классов уменьшения карты, и это работает. В моем другом классе (без уменьшения карты) я использую 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){
}
}
}
for each key(generally line)
выполнитьmap
операцию иfor each key in reducer collect elements of the same key and write in to hdfs
. Я не знаю, есть ли другой способ использования уменьшения карты, но таким образом вы автоматически сортируете данные по ключу. это еще одно преимущество MR. 13.05.2013Id_issue()
этот метод будет делать все, что вы хотите. 13.05.2013