在MapReduce中使用MultipleOutputs將結果輸出到指定的多個文件或文件夾
使用步驟主要有三步:
1、在reduce或map類中創建MultipleOutputs對象,將結果輸出;
class TestReducer extends Reducer<Text, Text, Text, Text>{
//將結果輸出到多個文件或多個文件夾
private MultipleOutputs mos;
protected void setup(Context context) throws IOException,InterruptedException {
mos = new MultipleOutputs<>(context); // 初始化mos
}
protected void cleanup(Context context) throws IOException,InterruptedException {
mos.close(); //關閉對象
}
}
2、在map或reduce方法中使用MultipleOutputs對象輸出數據,代替context.write();
protected void reduce(Text key, Iterable<Text> values, Context context)
throws IOException, InterruptedException {
.... // 計算key和value
//使用MultipleOutputs對象輸出數據
if(key.toString().equals("file1")){
mos.write("file1", key, value);
}else if(key.toString().equals("file2")){
mos.write("file2", key, value);
}
}
3、在創建job時,定義附加的輸出文件(),這裏的文件名稱與第二步設置的文件名相同;
要注意的是hadoop是不承認未經註冊namedOutput的,必須先在主函數中註冊,然後才能寫入,否則運行時會報not defined錯誤;所以要在主函數中用MultipleOutputs.addNamedOutput將對應的namedOutput文件註冊一下。
//定義附加的輸出文件
MultipleOutputs.addNamedOutput(job,"file1",TextOutputFormat.class,Text.class,Text.class);
MultipleOutputs.addNamedOutput(job,"file2",TextOutputFormat.class,Text.class,Text.class);