我需要處理文本文件的文件夾。文本文件可以是任何擴展名。識別文件夾中用於處理文件的擴展名使用hadoop mapreduce
對於每個擴展,我們需要單獨的自定義閱讀器來處理hadoop中的文件。
folder1/
Data1.pdf
Data2.xml
Data3.html
Data4.txt
Data5.csv
什麼是更好的方式來獲得文件夾中文件的擴展名併爲我的MR Job設置Custom InputFormat?
我做了什麼至今
驅動
FileStatus[] stati = null;
try {
stati = fs.listStatus(in);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
for (FileStatus status : stati) {
Path path = status.getPath();
System.out.println("Path----> "+path);
/*
* get file extension
*/
String ext = FilenameUtils.getExtension(path.toString());
System.out.println("ext--->"+ext);
if(ext.equals("pdf")){
//custom pdf record reader
job.setInputFormatClass(PdfInputFormat.class);
}
else{
job.setInputFormatClass(TextInputFormat.class);
}
}
但這不會witin的folder1工作,但如果文件夾1只包含.pdf文件能正常工作。
我錯過了什麼嗎?
希望,因爲我在文件夾迭代這是行不通的罰款(比如文件夾2 - > Data5.pdf,Data4.csv)。這setInputFormatClass不會向 TextInputFormat.addInputPath任何影響(作業中,)作爲inputformat將使用Data4.csv的最後迭代值進行設置。
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(Text.class);
job.setOutputKeyClass(NullWritable.class);
job.setOutputValueClass(NullWritable.class);
job.setMapperClass(MyMapper.class);
job.setReducerClass(MyReducer.class);
job.setOutputFormatClass(TextOutputFormat.class);
try {
TextInputFormat.addInputPath(job, in);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
TextOutputFormat.setOutputPath(job, out);
編輯
Job job = null;
try {
job = new Job(conf, "TextMining");
} catch (IOException e) {
e.printStackTrace();
}
/*
* check entension
*/
for (FileStatus status : stati) {
Path path = status.getPath();
System.out.println("Path----> "+path);
/*
* get file extension
*/
String ext = FilenameUtils.getExtension(path.toString());
System.out.println("ext--->"+ext);
if(ext.equals("pdf")){
System.out.println("Pdf File Format");
// MultipleInputs.addInputPath(job, path,PdfInputFormat.class, PDFStemmingMapper.class);
job.setInputFormatClass(PdfInputFormat.class);
}
else if(ext.equals("xlsx")){
System.out.println("Excel File Format");
job.setInputFormatClass(ExcelInputFormat.class);
}
else{
System.out.println("normal Text File");
job.setInputFormatClass(TextInputFormat.class);
}
}
job.setJarByClass(Driver.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(Text.class);
job.setOutputKeyClass(NullWritable.class);
job.setOutputValueClass(NullWritable.class);
//job.setInputFormatClass(TextInputFormat.class);
job.setMapperClass(MyMapper.class);
job.setReducerClass(MyReducer.class);
job.setOutputFormatClass(TextOutputFormat.class);
// try {
// TextInputFormat.addInputPath(job, in);
// } catch (IOException e) {
// e.printStackTrace();
// }
TextOutputFormat.setOutputPath(job, out);
我想實現有點像上面。 但是這沒有給出任何輸出。 請建議。
我如何才能將與MultipleInputs?這足以滿足我的情況。 MultipleInputs有助於加入不同的文件,如[this](http://unmeshasreeveni.blogspot.in/2014/12/joining-two-files-using-multipleinput.html)。MultipleInputs是否做得比這更多 –
MultipleInputs通常用於處理不同類型的文件,生成一個通用的輸出,因爲它是OR,所以可以進一步加入其他處理。例如:1)。從不同類型的文件(XML,JSON,TXT等)中提取訂單詳細信息。 2)加入是另一種類型的用例,其中「訂單和商品詳細信息」位於不同的文件中,並且您希望一條輸出記錄結合兩者的詳細信息。 **您的用例是什麼?** –
第一個是我的用例。我需要處理具有不同文件擴展名的文件夾中的文件 –