教你怎么使用hadoop来提取文件中的指定内容

一、需求

把以下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 {
//创建两条流
        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来提取文件中的指定内容的文章就介绍到这了,更多相关hadoop提取文件内容内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 在Docker中跑Hadoop与镜像制作方法

    重复造轮子,这里使用重新打包生成一个基于Docker的Hadoop镜像:   Hadoop集群依赖的软件分别为:jdk.ssh等,所以只要这两项还有Hadoop相关打包进镜像中去即可: 配置文件准备 1.Hadoop相关配置文件:core-site.xml.hdfs-site.xml.mapred-site.xml.yarn-site.xml.slaves.hadoop-env.sh 2.ssh配置文件:ssh_config 3.Hadoop集群启动文件:start-hadoop.sh 制作镜像

  • 手把手教你在腾讯云上搭建hadoop3.x伪集群的方法

    一.环境准备 CentOS Linux release 7.5.1804 (Core) 系统下 安装 创建文件夹 $ cd /home/centos $ mkdir software $ mkdir module 将安装包导入software文件夹 $ cd software # 然后把文件拖进去即可 这里使用的安装包是 /home/centos/software/hadoop-3.1.3.tar.gz /home/centos/software/jdk-8u212-linux-x64.tar.

  • Hadoop 使用IntelliJ IDEA 进行远程调试代码的配置方法

    一 .前言 昨天晚上遇到一个奇葩的问题, 搞好的环境DataNode启动报错. 报错信息提示的模棱两可,没办法定位原因. 办法,开启远程调试- 注意 : 开启远程调试的代码,必须与本地idea的代码必须保持一致. 二 .服务器端配置 2.1. 设置启动远程debug端口 修改 服务器上的配置文件 ${HADOOP_HOME}/etc/hadoop/hadoop-env.sh 增加 环境变量即可. 组件 环境变量设置 NameNode export HADOOP_NAMENODE_OPTS="-a

  • Hadoop集成Spring的使用详细教程(快速入门大数据)

    官网sprng-hadoop https://spring.io/projects/spring-hadoop 添加依赖 <dependencies> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-hadoop</artifactId> <version>2.5.0.RELEASE</version&g

  • Windows下使用IDEA搭建Hadoop开发环境的详细方法

    笔者鼓弄了两个星期,终于把所有有关hadoop的环境配置好了,一是虚拟机上的 完全分布式集群 ,但是为了平时写代码的方便,则在windows上也配置了hadoop的 伪分布式集群 ,同时在IDEA上就可以编写代码,同时在windows环境下进行运行.(如果不配置windows下的伪分布式集群,则在IDEA上编写的代码无法在windows平台下运行).笔者在网络上找了很多有关windows下使用idea搭建hadoop开发环境的中文教程都不太全,最后使用国外的英文教程配置成功,因此这里整理一下,方

  • centos7搭建hadoop2.10高可用(HA)

    本篇介绍在centos7中搭建hadoop2.10高可用集群,首先准备6台机器:2台nn(namenode);4台dn(datanode):3台jns(journalnodes) IP hostname 进程 192.168.30.141 s141 nn1(namenode),zkfc(DFSZKFailoverController),zk(QuorumPeerMain) 192.168.30.142 s142 dn(datanode), jn(journalnode),zk(QuorumPee

  • hadoop常见错误以及处理方法详解

    1.hadoop-root-datanode-master.log 中有如下错误:ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: java.io.IOException: Incompatible namespaceIDs in导致datanode启动不了.原因:每次namenode format会重新创建一个namenodeId,而dfs.data.dir参数配置的目录中包含的是上次format创建的id,和dfs.name.dir

  • Hadoop多Job并行处理的实例详解

    Hadoop多Job并行处理的实例详解 有关Hadoop多Job任务并行处理,经过测试,配置如下: 首先做如下配置: 1.修改mapred-site.xml添加调度器配置: <property> <name>mapred.jobtracker.taskScheduler</name> <value>org.apache.hadoop.mapred.FairScheduler</value> </property> 2.添加jar文件地

  • 教你怎么使用hadoop来提取文件中的指定内容

    一.需求 把以下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.

  • Python实现删除文件中含“指定内容”的行示例

    本文实例讲述了Python实现删除文件中含指定内容的行.分享给大家供大家参考,具体如下: #!/bin/env python import shutil, sys, os darray = [ "Entering directory", "In function ", "Leaving directory", "__NR_SYSCALL_BASE", "arm-hisiv100-linux-ar ", &q

  • Linux bash删除文件中含“指定内容”的行功能示例

    本文实例讲述了Linux bash删除文件中含"指定内容"的行功能.分享给大家供大家参考,具体如下: #!/bin/sh # 功能: 删除文件中含"指定内容"的行 # 运行方式: ./dline.sh c.log ==> 产生输出文件: c.log0 array=( "rm -f lvr_3531_pf_new" "arm-hisiv100-linux-gcc " "In function " &qu

  • 分步骤教你用python一步步提取PPT中的图片

    目录 一.实现原理 二.提取PPT中的图片 1.打开压缩包 2.解压文件 三.提取PPT中的图片 一.实现原理 其实实现原理很简单,我们的pptx文件其实是一个压缩包.我们可以直接修改pptx文件的后缀,改成zip然后解压,比如下面这个: 这是解压后的文件.我们可以在ppt目录下找到一个media目录,这个目录下就是我们要的图片的.这个目录包含了PPT的所有多媒体文件. 知道这点后,我们就可以选择用Python来解压出PPT中的media目录就可以提取出所有图片了. 二.提取PPT中的图片 1.

  • Python3实现从文件中读取指定行的方法

    本文实例讲述了Python3实现从文件中读取指定行的方法.分享给大家供大家参考.具体实现方法如下: # Python的标准库linecache模块非常适合这个任务 import linecache the_line = linecache.getline('d:/FreakOut.cpp', 222) print (the_line) # linecache读取并缓存文件中所有的文本, # 若文件很大,而只读一行,则效率低下. # 可显示使用循环, 注意enumerate从0开始计数,而line

  • Shell脚本从文件中逐行读取内容的几种方法实例

    从文件逐行读取数据的方法有两种,一种是在while循环或until循环中使用read命令,通过文件描述符一行一行的读取文件内容:另一种是在for循环中使用cat <filename>来读取文件的内容. 1.使用for循环从文件中逐行读取内容:在默认情况现下此方法是逐个单词的读取文件内容,因为使用这种方法读取文件时,他使用环境变量IFS的值作为分隔符,由于IFS的默认值是"<space/空格>""<tab/制表符>""&l

  • Python从文件中读取指定的行以及在文件指定位置写入

    Python从文件中读取指定的行 如果想根据给出的行号, 从文本文件中读取一行数据,  Python标准库linecache模块非常适合这个任务: 测试文件内容 : This is line 1. This is line 2. This is line 3. This is line 4. This is line 5. This is line 6. This is line 7. This is line 8. 测试代码: >>> import linecache >>

  • C++提取文件中信息的方法

    对于文件比较复杂的时候,为了获取文件中的信息,需要一些比较特殊的函数,比如,getline().replace().atoi,atof等 例子一,读取以下文件中的数据,并保存进一个类里面. 首先,类的定义如下,感觉是struct,但是按照struct的处理,我这段代码出错了,不知道什么问题,暂时po出来吧,有空看看. struct ImageLabel{ std::string imagePath;//save图片路径名 int faceBox[4];//输入点集的最外层包络矩形rect四个参数

  • sed删除文件中的一行内容的脚本代码

    先来看下原始文件的内容: 复制代码 代码如下: root@localhost ~]# cat file.txthello worlda:b:c -h -na:b:c -h -n sed根据条件删除相关的行: 复制代码 代码如下: [root@localhost ~]# sed -i '/a:b:c -h -n/d' file.txt[root@localhost ~]# cat file.txthello world sed根据条件进行相关内容的替换: 复制代码 代码如下: [root@loca

  • 利用jquery的获取JS文件中的字符串内容

    复制代码 代码如下: <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js"></script> <script type="text/javascript"> var _url = "http://www.baidu.com/cache/hps/js/hp

随机推荐