MapReduce中ETL数据清洗案例

在实际业务场景中,我们在对数据处理时会先对数据进行清洗,比如过滤掉一些无效数据;清洗数据只需要map阶段即可,不需要reduce阶段。

在该案例中我们要实现的是员工表数据中只留下部门编号为d01的数据。

  • 数据准备
001,Tina,d03
002,Sherry,d01
003,Bob,d01
004,Sam,d02
005,Mohan,d01
006,Tom,d03

新建project:

  • 引入pom依赖


    4.0.0

    wyh.test
    TestETL
    1.0-SNAPSHOT

    
        8
        8
    

    jar
    
        
            org.apache.hadoop
            hadoop-common
            3.1.3
        
        
            org.apache.hadoop
            hadoop-client
            3.1.3
        
        
            org.apache.hadoop
            hadoop-hdfs
            3.1.3
        
        
            org.apache.hadoop
            hadoop-mapreduce-client-core
            3.1.3
        
        
            junit
            junit
            RELEASE
        
    
    
        
            
                org.apache.maven.plugins
                maven-compiler-plugin
                3.1
                
                    1.8
                    1.8
                    UTF-8
                
            
            
                org.apache.maven.plugins
                maven-shade-plugin
                2.4.3
                
                    
                        package
                        
                            shade
                        
                        
                            true
                        
                    
                
            
        
    

  • 自定义Mapper
package wyh.test;

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 ETLMapper extends Mapper {
    @Override
    protected void map(LongWritable key, Text value, Mapper.Context context) throws IOException, InterruptedException {
        String[] split = value.toString().split(",");
        if("d01".equals(split[2])){
            //部门编号为d01,留下
            context.write(value, NullWritable.get());
        }else{
            return;
        }
    }
}
  • 自定义主类
package wyh.test;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
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 org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;

import java.net.URI;

public class ETLJobMain extends Configured implements Tool {
    @Override
    public int run(String[] strings) throws Exception {
        Job job = Job.getInstance(super.getConf(), "testETLJob");
        //!!!!!!!!!!    集群必须要设置    !!!!!!!!
        job.setJarByClass(ETLJobMain.class);
        //配置job具体要执行的任务步骤
        //指定要读取的文件的路径,这里写了目录,就会将该目录下的所有文件都读取到(这里只需要放employee.txt即可)
        FileInputFormat.setInputPaths(job, new Path("D:\\test_hdfs"));
        //指定map处理逻辑类
        job.setMapperClass(ETLMapper.class);
        //指定map阶段输出的k2类型
        job.setMapOutputKeyClass(Text.class);
        //指定map阶段输出的v2类型
        job.setMapOutputValueClass(NullWritable.class);
        //由于map端已经把预期的输出结果处理好了,不需要reduce端再处理,所以这里设置reduceTask个数为0
        job.setNumReduceTasks(0);
        //指定结果输出路径,该目录必须是不存在的目录(如已存在该目录,则会报错),它会自动帮我们创建
        FileOutputFormat.setOutputPath(job, new Path("D:\\testETLouput"));
        //返回执行状态
        boolean status = job.waitForCompletion(true);
        //使用三目运算,将布尔类型的返回值转换为整型返回值,其实这个地方的整型返回值就是返回给了下面main()中的runStatus
        return status ? 0:1;
    }

    public static void main(String[] args) throws Exception {
        Configuration configuration = new Configuration();
        /**
         * 参数一是一个Configuration对象,参数二是Tool的实现类对象,参数三是一个String类型的数组参数,可以直接使用main()中的参数args.
         * 返回值是一个整型的值,这个值代表了当前这个任务执行的状态.
         * 调用ToolRunner的run方法启动job任务.
         */
        int runStatus = ToolRunner.run(configuration, new ETLJobMain(), args);
        /**
         * 任务执行完成后退出,根据上面状态值进行退出,如果任务执行是成功的,那么就是成功退出,如果任务是失败的,就是失败退出
         */
        System.exit(runStatus);

    }

}
  • 运行程序并查看结果

MapReduce中ETL数据清洗案例_第1张图片

MapReduce中ETL数据清洗案例_第2张图片

 可以看到只有部门为d01的数据留下来了,符合预期结果。

这样就简单地实现了ETL中地数据清洗过程。

你可能感兴趣的:(大数据之Hadoop,etl,大数据,数据仓库,hadoop)