import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.RecordWriter;
import org.apache.hadoop.mapreduce.TaskAttemptContext;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import java.io.IOException;
import java.util.UUID;
/**
* 自定义MyFileOutputFormat继承FileOutputFormat,实现其中的getRecordWriter方法;
* 该方法返回一个RecordWriter对象,需先创建此对象,实现其中的write、close方法;
* 文件通过FileSystem在write方法中写出到hdfs自定义文件中
*/
public class MyFileOutputFormat extends FileOutputFormat<Text, Text> {
@Override
public RecordWriter<Text, Text> getRecordWriter(TaskAttemptContext job)
throws IOException, InterruptedException {
FileSystem fs = FileSystem.newInstance(job.getConfiguration());
final FSDataOutputStream math = fs.create(new Path(job.getConfiguration().get("fs.todo.inputPath") + "/" + UUID.randomUUID().toString().replaceAll("-","")));
RecordWriter<Text, Text> recordWriter = new RecordWriter<Text, Text>() {
@Override
public void write(Text key, Text value) throws IOException,
InterruptedException {
// math.writeUTF(value.toString()+"\n");
math.writeChars(value.toString()+"\n");
}
@Override
public void close(TaskAttemptContext context) throws IOException,
InterruptedException {
if (math!=null) {
math.close();
}
}
};
return recordWriter;
}
}
上述写出文件时会带有\u0000分隔 如果自定义文件格式带有\u0000的不适合该输出
选择math.writeUTF() 文件中每行数据前面会带有2个byte数据
也不适合我们需求的文件格式
后面查看
TextOutputFormat源码格式 直接设置outputPath
源码部分
主要修改的地方
最后在启动类添加MyFileOutputFormat即可