hadoop 自定义OutputFormat
时间:2019-08-31
本文章向大家介绍hadoop 自定义OutputFormat,主要包括hadoop 自定义OutputFormat使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1、继承FileOutputFormat,复写getRecordWriter方法
/** * @Description:自定义outputFormat,输出数据到不同的文件 */ public class FilterOutputFormat extends FileOutputFormat<Text, NullWritable> { @Override public RecordWriter<Text, NullWritable> getRecordWriter(TaskAttemptContext job) throws IOException, InterruptedException { return new FRecordWriter(job); } }
2、实现RecordWriter
/** * @Description: 继承RecordWriter,实现数据输出到不同目录文件 */ public class FRecordWriter extends RecordWriter<Text, NullWritable> { FSDataOutputStream out1 = null; FSDataOutputStream out2 = null; @Override public void write(Text key, NullWritable value) throws IOException, InterruptedException { // 判断是否包含“baidu”和"alibaba"字符串,输出到不同文件 if (key.toString().contains("baidu") || key.toString().contains("alibaba")) { out1.write(key.toString().getBytes()); } else { out2.write(key.toString().getBytes()); } } @Override public void close(TaskAttemptContext context) throws IOException, InterruptedException { IOUtils.closeStream(out1); IOUtils.closeStream(out2); } public FRecordWriter(TaskAttemptContext job) { FileSystem fs; try { Path path1 = new Path("output1/a.log"); Path path2 = new Path("output2/b.log"); System.out.println(path1.getName()); System.out.println(path2.getName()); fs = FileSystem.get(job.getConfiguration()); out1 = fs.create(path1); out2 = fs.create(path2); }catch (Exception e){ e.printStackTrace(); } } }
3、map
/** * @Description: 按行读取,按行写入 */ public class FilterMapper extends Mapper<LongWritable, Text, Text, NullWritable> { @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { context.write(value,NullWritable.get()); } }
4、reducer
public class FilterReducer extends Reducer<Text, NullWritable,Text,NullWritable> { private Text newLine = new Text(); @Override protected void reduce(Text key, Iterable<NullWritable> values, Context context) throws IOException, InterruptedException { //循环null值的values是防止key里有重复的数据没有被取出 //Iterable<NullWritable> values迭代器里存储了key和value(虽然本例中value都是null值) //通过循环迭代器,迭代器里的key值也会被不断取出赋值到Text key中(公用内存地址) for (NullWritable value : values) { newLine.set(key.toString()+"\r\n"); context.write(newLine,value); } } }
5、driver
/** * @Description: 自定义输出 * 实现对样本按行分割,判断是否包含baidu或alibaba字符串, * 包含则写入目录1,不包含写入目录2, */ public class FilterDriver { public static void main(String args[]) throws Exception{ if(args.length!=2) { System.err.println("使用格式:FilterDriver <input path> <output path>"); System.exit(-1); } Configuration conf = new Configuration(); Job job = Job.getInstance(conf); job.setJarByClass(FilterDriver.class); job.setMapperClass(FilterMapper.class); job.setReducerClass(FilterReducer.class); job.setMapOutputKeyClass(Text .class); job.setMapOutputValueClass(NullWritable .class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(NullWritable.class); // 要将自定义的输出格式组件设置到job中 job.setOutputFormatClass(FilterOutputFormat.class); FileInputFormat.setInputPaths(job, new Path(args[0])); // 虽然我们自定义了outputformat,但是因为我们的outputformat继承自fileoutputformat // 而fileoutputformat要输出一个_SUCCESS文件,所以,在这还得指定一个输出目录 FileOutputFormat.setOutputPath(job, new Path(args[1])); Path outPath = new Path(args[1]); FileSystem fs = FileSystem.get(conf); if(fs.exists(outPath)){ fs.delete(outPath,true); } boolean result = job.waitForCompletion(true); System.exit(result ? 0 : 1); } }
原文地址:https://www.cnblogs.com/asker009/p/11440866.html
- 使用 MEF 轻松实现云部署
- 检测常见ASP.NET配置安全漏洞
- Flash/Flex学习笔记(56):矩阵变换
- js小技巧:tab页切换
- c#字符串操作方法实例
- Android中Fragment+ViewPager的配合使用
- 结合机器学习与生物医学技术,寻找Uber司机出行模式
- ASP.NET MVC 4 - 测试驱动 ASP.NET MVC
- LVS+Keepalived高可用环境部署梳理(主主和主从模式)
- 随着区块链的火爆,相关顶级域名“矿池”KC.com已建站
- Flash/Flex学习笔记(50):3D线条与填充
- LVM常规操作记录梳理(扩容/缩容/快照等)
- Flash/Flex学习笔记(55):背面剔除与 3D 灯光
- 资源等待类型sys.dm_os_wait_stats
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 一文搞定冒泡排序算法
- 剑指Offer LeetCode 面试题25. 合并两个排序的链表
- LeetCode 20200601 打卡 1431. 拥有最多糖果的孩子
- 剑指Offer LeetCode 面试题24. 反转链表
- 剑指Offer LeetCode 面试题22. 链表中倒数第k个节点
- 剑指Offer LeetCode 面试题18. 删除链表的节点
- 剑指Offer LeetCode 面试题06. 从尾到头打印链表
- 最详细的docker中安装并配置redis
- 剑指Offer LeetCode 面试题59 - I. 滑动窗口的最大
- 剑指Offer LeetCode 面试题58 - II. 左旋转字符串
- 剑指Offer LeetCode 面试题58 - I. 翻转单词顺序
- 剑指Offer LeetCode 面试题56 - II. 数组中数字出现的次数 II
- 站在软件工程的角度重新思考面向对象(含高清图谱)
- 剑指Offer LeetCode 面试题57. 和为s的两个数字
- 白嫖Layui树型可折叠,可自定义,可搜索表格的实例