教你怎么使用hadoop來提取文件中的指定內(nèi)容
更新時間:2021年05月26日 14:40:44 作者:日京
發(fā)現(xiàn)有很多小伙伴不會使用hadoop來提取文件中的指定內(nèi)容,今天特地整理了這篇文章,文中有非常詳細的代碼示例,對不會這個方法的小伙伴們有很好地幫助,需要的朋友可以參考下
一、需求
把以下txt中含“baidu”字符串的鏈接輸出到一個文件,否則輸出到另外一個文件。

二、步驟
1.LogMapper.java
package com.whj.mapreduce.outputformat;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import java.io.IOException;
public class LogMapper extends Mapper<LongWritable,Text,Text,NullWritable> {
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
// 不做任何處理
context.write(value,NullWritable.get());
}
}
2.LogReducer.java
package com.whj.mapreduce.outputformat;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import java.io.IOException;
public class LogReducer extends Reducer<Text,NullWritable,Text,NullWritable> {
@Override
protected void reduce(Text key, Iterable<NullWritable> values, Context context) throws IOException, InterruptedException {
for (NullWritable value : values) {
context.write(key,NullWritable.get());
}
}
}
3.LogOutputFormat.java
package com.whj.mapreduce.outputformat;
import org.apache.hadoop.io.NullWritable;
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;
public class LogOutputFormat extends FileOutputFormat<Text,NullWritable> {
@Override
public RecordWriter<Text, NullWritable> getRecordWriter(TaskAttemptContext job) throws IOException, InterruptedException {
LogRecordWriter lrw = new LogRecordWriter(job);
return lrw;
}
}
4.LogRecordWriter.java
package com.whj.mapreduce.outputformat;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.RecordWriter;
import org.apache.hadoop.mapreduce.TaskAttemptContext;
import java.io.IOException;
public class LogRecordWriter extends RecordWriter<Text,NullWritable> {
private FSDataOutputStream baiduOut;//ctrl+alt+f
private FSDataOutputStream otherOut;
public LogRecordWriter(TaskAttemptContext job) throws IOException {
//創(chuàng)建兩條流
FileSystem fs = FileSystem.get(job.getConfiguration());
baiduOut = fs.create(new Path("D:\\temp\\outputformat.log"));
otherOut = fs.create(new Path("D:\\temp\\other.log"));
}
@Override
public void write(Text key, NullWritable nullWritable) throws IOException, InterruptedException {
// 具體寫
String log = key.toString();
if(log.contains("baidu")){
baiduOut.writeBytes(log+"\n");
}else{
otherOut.writeBytes(log+"\n");
}
}
@Override
public void close(TaskAttemptContext taskAttemptContext) throws IOException, InterruptedException {
//關流
IOUtils.closeStream(baiduOut);
IOUtils.closeStream(otherOut);
}
}
5.LogDriver.java
package com.whj.mapreduce.outputformat;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import java.io.IOException;
public class LogDriver {
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
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);
//設置自定義的 outputformat
job.setOutputFormatClass(LogOutputFormat.class);
FileInputFormat.setInputPaths(job, new Path("D:\\input"));
// 雖 然 我 們 自 定 義 了 outputformat , 但 是 因 為 我 們 的 outputformat 繼承自fileoutputformat
//而 fileoutputformat 要輸出一個_SUCCESS 文件,所以在這還得指定一個輸出目錄
FileOutputFormat.setOutputPath(job, new Path("D:\\temp\\logoutput"));
boolean b = job.waitForCompletion(true);
System.exit(b ? 0 : 1);
} }
三、結果

到此這篇關于教你怎么使用hadoop來提取文件中的指定內(nèi)容的文章就介紹到這了,更多相關hadoop提取文件內(nèi)容內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringBoot中使用EasyExcel并行導出多個excel文件并壓縮zip后下載的代碼詳解
SpringBoot的同步導出方式中,服務器會阻塞直到Excel文件生成完畢,在處理大量數(shù)據(jù)的導出功能,本文給大家介紹了SpringBoot中使用EasyExcel并行導出多個excel文件并壓縮zip后下載,需要的朋友可以參考下2024-09-09
JAVA根據(jù)ip地址獲取歸屬地的實現(xiàn)方法
本文主要介紹了JAVA根據(jù)ip地址獲取歸屬地的實現(xiàn)方法,要通過Java程序獲取IP地址對應的城市,需要借助第三方的IP地址庫,下面就來介紹一下,感興趣的可以了解一下2023-10-10
Java Spring MVC 上傳下載文件配置及controller方法詳解
這篇文章主要介紹了Java Spring MVC 上傳下載文件配置及controller方法詳解,本文介紹的非常詳細,具有參考借鑒價值,需要的朋友可以參考下2016-09-09

