【Daily Blog】使用MapReduce对数据进行简单的统计

第一次使用MapReduce进行数据处理,简单的进行记录(行业新人,如以下描述有错误部分,还望前辈指正,为谢!)

MapReduce分为Map 和Reduce 两块,Map主要是对数据进行切分排序,reduce进行累加计数
如下为代码块:
Mapper部分:分别获取每行数据,并对其按照用户要求进行拆分(下面代码是以空格进行拆分)进行拆分,通过遍历获取到每个每个拆分的数据对象,以key value进行计数。向磁盘输出Map结果

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

import java.io.IOException;

/*
* mapper类
* 数据输入的类型K,V-->LongWritable,Text
* 数据输出类型K,V-->Text,IntWritable
* */
public class WCMap extends Mapper<LongWritable, Text,Text, IntWritable>{
    //实现父类的快捷键alt+insert
    @Override
    /*context将map和reduce连接到一起。上下文
    * */
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        //获取一行数据
        String line = value.toString();
        //切分,按照空格切分
        String[] fields = line.split(" ");
        //遍历获取每个单词
        for (String field : fields) {
            //输出,每个单词拼接1(标记)(Java(k) 1(v))
            context.write(new Text(field),new IntWritable(1));
        }
    }
}

Reduce部分:从磁盘中读取Map的输出结果,Reduce的输入类型和Map的输出数据类型是一样的,对Map的数据进行遍历,声明一个count进行计数,每当遍历到相同对象的时候count++,输出结果的类型由用户定义,将count的结果也按照键值对(K,V)输出到磁盘上。

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

import java.io.IOException;

/*
 * Reduce类
 * 数据输入的类型K,V-->Text,IntWritable
 * 数据输出类型K,V-->Text,IntWritable
 * */
public class WCReduce extends Reducer<Text, IntWritable,Text, IntWritable> {
    //crtl+o  实现父类方法
    //Iterable 迭代器
    @Override
    protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {

        //定义一个计数器
        int count =0;
        //累加计数
        for (IntWritable intWritable:values){
            //intWritable  转化成int类型
            count+=intWritable.get();
        }
        //输出
        context.write(key,new IntWritable(count));
    }
}

Driver部分:首先实例化配置文件,用来执行MapReduce,用job分别执行Mappe和Rdeucer的任务,需配置输出类型。因为是进行测试,所以我用的是本地文件进行统计,值得注意的是最终的输出路径需是不存在的文件夹,在输出时系统会为输出结果创建存储的文件夹。最后提交任务。

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
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 WCDriver {
    public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {

        //实例化配置文件
        Configuration configuration = new Configuration();
        //定义一个job任务
        Job job = Job.getInstance(configuration);
        //配置job的信息
        job.setJarByClass(WCDriver.class);
        //指定自定义的mapper到job以及mapper的输出数据类型到job
        job.setMapperClass(WCMap.class);
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(IntWritable.class);

        //指定自定义的reduce到job以及reduce的输出数据类型(总输出的类型)到job
        job.setReducerClass(WCReduce.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);
        //配置输入数据的路径
        FileInputFormat.setInputPaths(job,new Path("F:\\lihuan\\wordcount.txt"));
        //配置输出数据的路径
        FileOutputFormat.setOutputPath(job,new Path("F:\\lihuan\\output\\0916"));


        //提交任务
        job.waitForCompletion(true);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值