MapReduce(六):OutputFormat數(shù)據(jù)輸出

OutputFormat接口實(shí)現(xiàn)類

OutputFormat是MapReduce輸出的基類,所有實(shí)現(xiàn)MapReduce輸出都實(shí)現(xiàn)了OutputFormat接口梅垄。


3.1 OutputFormat接口實(shí)現(xiàn)類.png

默認(rèn)輸出格式TextOutputFormat

自定義OutputFormat

1)應(yīng)用場景

輸出數(shù)據(jù)到MySQL/HBase/ES等存儲(chǔ)框架中。

2)自定義OutputFormat步驟

  • 自定義一個(gè)類繼承FileOutputFormat刮刑。

  • 重寫RecordWriter毅戈,具體重寫輸出數(shù)據(jù)的方法write()夯秃。

實(shí)戰(zhàn)

LogRecordWriter.java

public class LogRecordWriter extends RecordWriter<Text, NullWritable> {

    private FSDataOutputStream oneOut;
    private FSDataOutputStream otherOut;

    public LogRecordWriter(TaskAttemptContext job) {
        // 創(chuàng)建流
        try {
            FileSystem fileSystem = FileSystem.get(job.getConfiguration());
            oneOut = fileSystem.create(
                new Path(System.getProperty("user.dir")+"/output/outputfromat/one.txt"));
            otherOut = fileSystem.create(
                new Path(System.getProperty("user.dir")+"/output/outputfromat/other.txt"));

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    @Override
    public void write(Text key, NullWritable value) throws IOException, InterruptedException {
        // 具體寫
        String line = key.toString();
        if(line.contains("https")){
            oneOut.writeBytes(line+"\n");
        }else{
            otherOut.writeBytes(line+"\n");
        }
    }

    @Override
    public void close(TaskAttemptContext context) throws IOException, InterruptedException {
        IOUtils.closeStream(oneOut);
        IOUtils.closeStream(otherOut);
    }
}

LogOutputFormat.java

public class LogOutputFormat extends FileOutputFormat<Text, NullWritable> {

    @Override
    public RecordWriter<Text, NullWritable> getRecordWriter(TaskAttemptContext job)
        throws IOException, InterruptedException {
        LogRecordWriter logRecordWriter = new LogRecordWriter(job);
        return logRecordWriter;
    }
}

LogMapper.java

public class LogMapper extends Mapper<LongWritable, Text, Text, NullWritable> {

    @Override
    protected void map(LongWritable key, Text value,
        Mapper<LongWritable, Text, Text, NullWritable>.Context context)
        throws IOException, InterruptedException {
        context.write(value, NullWritable.get());
    }
}

LogReducer.java

public class LogReducer  extends Reducer<Text, NullWritable, Text, NullWritable> {

    @Override
    protected void reduce(Text key, Iterable<NullWritable> values,
        Reducer<Text, NullWritable, Text, NullWritable>.Context context)
        throws IOException, InterruptedException {
        for (NullWritable value : values) {
            context.write(key,NullWritable.get());
        }
    }
}

LogDriver.java

public class LogDriver {

    public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();
        Job job = Job.getInstance(conf);

        job.setJarByClass(LogDriver.class);
        job.setMapperClass(LogMapper.class);
        job.setReducerClass(LogReducer.class);

        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(NullWritable.class);

        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(NullWritable.class);

        // 設(shè)置自定義的OutputFormat
        job.setOutputFormatClass(LogOutputFormat.class);

        FileInputFormat.setInputPaths(job, new Path(System.getProperty("user.dir")+"/input/outputfromat"));
        // 雖然我們定義類OutputFormat,但是因?yàn)槲覀兊腛utputFormat繼承自FileOutputFormat
        // 而FileOutputFormat要輸出一個(gè)_SUCCESS文件徽惋,所以還得指定一個(gè)輸出目錄
        FileOutputFormat.setOutputPath(job, new Path(System.getProperty("user.dir")+"/output/outputfromat"));

        boolean b = job.waitForCompletion(true);
        System.exit(b?0:1);
    }

}

代碼gitee地址

小結(jié)

本節(jié)我們了解到了OutputFormat數(shù)據(jù)輸出疆拘,認(rèn)識(shí)到自定義輸出流。在實(shí)際應(yīng)用中寂曹,F(xiàn)ileOutputFormat并不能完全滿足需求,可以通過繼承OutputFormat來自定義輸出回右。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末隆圆,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子翔烁,更是在濱河造成了極大的恐慌渺氧,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蹬屹,死亡現(xiàn)場離奇詭異侣背,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)慨默,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門贩耐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人厦取,你說我怎么就攤上這事潮太。” “怎么了虾攻?”我有些...
    開封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵铡买,是天一觀的道長。 經(jīng)常有香客問我霎箍,道長奇钞,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任漂坏,我火速辦了婚禮景埃,結(jié)果婚禮上媒至,老公的妹妹穿的比我還像新娘。我一直安慰自己纠亚,他們只是感情好塘慕,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蒂胞,像睡著了一般图呢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上骗随,一...
    開封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天蛤织,我揣著相機(jī)與錄音,去河邊找鬼鸿染。 笑死指蚜,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的涨椒。 我是一名探鬼主播摊鸡,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蚕冬!你這毒婦竟也來了免猾?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬榮一對情侶失蹤囤热,失蹤者是張志新(化名)和其女友劉穎猎提,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體旁蔼,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡锨苏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了棺聊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片伞租。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖限佩,靈堂內(nèi)的尸體忽然破棺而出肯夏,到底是詐尸還是另有隱情,我是刑警寧澤犀暑,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布驯击,位于F島的核電站,受9級(jí)特大地震影響耐亏,放射性物質(zhì)發(fā)生泄漏徊都。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一广辰、第九天 我趴在偏房一處隱蔽的房頂上張望暇矫。 院中可真熱鬧主之,春花似錦、人聲如沸李根。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽房轿。三九已至粤攒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間囱持,已是汗流浹背夯接。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留纷妆,地道東北人盔几。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像掩幢,于是被迫代替她去往敵國和親逊拍。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容