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);
} }
hadoop 自定义OutputFormat的更多相关文章
- [Hadoop] - 自定义Mapreduce InputFormat&OutputFormat
在MR程序的开发过程中,经常会遇到输入数据不是HDFS或者数据输出目的地不是HDFS的,MapReduce的设计已经考虑到这种情况,它为我们提供了两个组建,只需要我们自定义适合的InputFormat ...
- Hadoop案例(五)过滤日志及自定义日志输出路径(自定义OutputFormat)
过滤日志及自定义日志输出路径(自定义OutputFormat) 1.需求分析 过滤输入的log日志中是否包含xyg (1)包含xyg的网站输出到e:/xyg.log (2)不包含xyg的网站输出到e: ...
- Hadoop_27_MapReduce_运营商原始日志增强(自定义OutputFormat)
1.需求: 现有一些原始日志需要做增强解析处理,流程: 1. 从原始日志文件中读取数据(日志文件:https://pan.baidu.com/s/12hbDvP7jMu9yE-oLZXvM_g) 2. ...
- Hadoop自定义类型处理手机上网日志
job提交源码分析 在eclipse中的写的代码如何提交作业到JobTracker中的哪?(1)在eclipse中调用的job.waitForCompletion(true)实际上执行如下方法 con ...
- 第3节 mapreduce高级:7、自定义outputformat实现输出到不同的文件夹下面
2.1 需求 现在有一些订单的评论数据,需求,将订单的好评与差评进行区分开来,将最终的数据分开到不同的文件夹下面去,数据内容参见资料文件夹,其中数据第九个字段表示好评,中评,差评.0:好评,1:中评, ...
- MapReduce之自定义OutputFormat
@ 目录 OutputFormat接口实现类 自定义OutputFormat使用场景及步骤 使用场景 自定义OutputFormat 案例实操 OutputFormat接口实现类 OutputForm ...
- 关于spark写入文件至文件系统并制定文件名之自定义outputFormat
引言: spark项目中通常我们需要将我们处理之后数据保存到文件中,比如将处理之后的RDD保存到hdfs上指定的目录中,亦或是保存在本地 spark保存文件: 1.rdd.saveAsTextFile ...
- Hadoop自定义分组Group
matadata: hadoop a spark a hive a hbase a tachyon a storm a redis a 自定义分组 import org.apache.hadoop.c ...
- Hadoop日记Day13---使用hadoop自定义类型处理手机上网日志
测试数据的下载地址为:http://pan.baidu.com/s/1gdgSn6r 一.文件分析 首先可以用文本编辑器打开一个HTTP_20130313143750.dat的二进制文件,这个文件的内 ...
随机推荐
- execjs使用时异常
一.异常信息(...gbk.....) UnicodeDecodeError: 'gbk' codec can't decode byte 0xa1 in position 26: illegal m ...
- 代码提示—ArcGIS API forJavaScript for JavaScript 编辑器代码提示(支持3.x和4.x)
我一般用WebStorm来arcgis api for js的代码,因为api中的内容太多,每次写代码都要去官方API网站查询,很不方便,所以决定配置一个代码补全,方便写接口. 通过ArcGIS AP ...
- OC代码规范小记
代码规范 一:基本代码命名 1.通用原则 尽量清晰又简洁,无法两全时清晰更重要,可读性优先级更高. insertObject:atIndex: 好的 insert:at 坏的 removeObject ...
- react-native 键盘遮挡输入框
Android上已经自动对键盘遮挡输入框做了处理,所以我们只需要关注ios. 1.首先引入 KeyboardAvoidingView import { KeyboardAvoidingView } f ...
- fork函数的一些小结
今天遇到一个这样的问题,假设父进程有一个变量S,fork后,子进程中的变量S地址是否和父进程中的变量S 是相同的? 再学操作系统的时候,知道fork是采用的写时复制,所以如果子进程或者父进程不对变量S ...
- 洛谷 P5638 光骓者的荣耀
洛谷 P5638 [CSGRound2]光骓者的荣耀 洛谷传送门 题目背景 小 K 又在做白日梦了.他进入到他的幻想中,发现他打下了一片江山. 题目描述 小 K 打下的江山一共有nn个城市,城市ii和 ...
- WPF 精修篇 自定义控件
原文:WPF 精修篇 自定义控件 自定义控件 因为没有办法对界面可视化编辑 所以用来很少 现在实现的是 自定义控件的 自定义属性 和自定义方法 用VS 创建自定义控件后 会自动创建 Themes 文件 ...
- STL pair类型的介绍
pair标准库类型它定义在头文件utility中. 一个pair保存两个数据成员.类似容器,pair是一个用来生成特定类型的模板.当创建一个pair时,我们必须提供两个类型名,pair的数据成员将具有 ...
- 【STM32H7教程】第31章 STM32H7的USART应用之RS485
完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第31章 STM32H7的USART应用之RS48 ...
- Luogu P2570 [ZJOI2010]贪吃的老鼠
Luogu P2570 [ZJOI2010]贪吃的老鼠 题目描述 奶酪店里最近出现了\(m\)只老鼠!它们的目标就是把生产出来的所有奶酪都吃掉.奶酪店中一天会生产\(n\)块奶酪,其中第\(i\)块的 ...