MapReduce中自定义文件输出名

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即可  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值