WordCount词频统计

WordCount词频统计,第1张

WordCount词频统计 @WordCount词频统计详解(乱序版)

WordCount主要分三部分:
WordCountMain、WordCountMapper、WordcountReducer

WordCountMain: 用来统筹map逻辑以及reducer逻辑

WordCountMapper:
切分,编写map逻辑使得转换成

WordcountReducer:

编写reducer逻辑使得转换成

WordCountMain
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
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.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;

   //将map与reducer组织在一起
public class WordCountMain extends Configured implements Tool { //alt+enter实现方法
    @Override
    public int run(String[] strings) throws Exception {
    //方法名:getInstance,需要参数,接收并获取返回值类型(Ctrl+Alt+V)
    //   Job.getInstance(super.getConf(),"wc"); 获取返回值类型后如下
    Job job = Job.getInstance(super.getConf(), "wc");
    //  获取的job用来组织起来MapReduce

    // 1、读取文件解析成key value对   TextInputFormat
    //通过job使用setInputFormatClass使得job与TextInputformat相关联 从而进行输入
    job.setInputFormatClass(TextInputFormat.class);
    //给TextInputFormat设置文件读取路径    Path路径
    TextInputFormat.addInputPath(job, new Path(""));
    //2、map逻辑
    //通过job将Mapper引进来
    job.setMapperClass(WordCountMapper.class);
    //设置map的输出 输出k2 v2
    job.setMapOutputKeyClass(Text.class);//k2
    job.setMapOutputValueClass(IntWritable.class);//v2

    //3~6 分区   排序    规约    分组

    //7、ruducer逻辑
    //同样通过job引进Reducer
    job.setReducerClass(WordCountReducer.class);
    //设置reduce输出
    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(IntWritable.class);

    //8、输出
    //通过job使用setOutputFormatClass使得job与TextOutputFormat相关联从而进行输出
    job.setOutputFormatClass(TextOutputFormat.class);
    TextOutputFormat.setOutputPath(job, new Path(""));

    boolean b = job.waitForCompletion(true);
    return b?0:1;
}
public static void main(String[] args) throws Exception {
    Configuration conf = new Configuration();
 //   ToolRunner.run(conf,new WordCountMain(),args); //alt + enter 抛出异常
//    run方法有conf、tool、args三个参数,然后方法需要返回值
//    返回值快捷键 Ctrl + Alt +V 变形成如下
    int run = ToolRunner.run(conf, new WordCountMain(), args);//alt + enter 抛出异常
// 对run方法获取返回值后,根据获取的返回值正常退出run方法
    System.exit(run);
}

}

 
WordCountMapper 
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;

//k1 行偏移量(阿拉伯数字)     LongWritable                v1 行文本内容    Text
//k2一个个单词             Text                            v2 数字1     IntWritable
//public class WordCountMapper extends Mapper将key-value的类 型替代k1、v1、k2、v2
public class WordCountMapper extends Mapper {
    //map回车后得到如下
   
    private Text k2 = new Text();
    private IntWritable v2 = new IntWritable();
    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
                 //map方法需要三个参数 k1      v1         上下文context;void无返回值
        // 通过context。write()将数据写出
       // context.write(k2,v2); 声明k2 v2

        //对map方法传进来的k1 v1 进行处理
        //将v1的类型转化为字符串并通过split进行切分,切分按照“,”进行
        //split切分后返回的一定是String类型的数组,通过Ctrl+Alt+V接收返回值
       // value.toString().split(",")通过Ctrl+Alt+V后如下
         String[] words = value.toString().split(",");
        //将words数组中的数据遍历 iter+回车得到for循环
        for (String word : words) {
        //通过k2.set()填充,将word放入k2
        k2.set(word);
        v2.set(1);

            context.write(k2,v2);
        }
       // context.write(k2,v2);将其放入for循环中使数据被遍历后输出



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

import java.io.IOException;

//public class WordCountReducer extends Reducer
//k3                                      v3 聚合
public class WordCountReducer extends Reducer {
    //通过reduce+回车获取reduce方法
  
//    private Text k3 =new Text();因为k2和k3相同所以直接用传进reduce方法的key(k2)代替k3
    private IntWritable v3 = new IntWritable();
    @Override
    protected void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException {
        // 没有返回值方法reduce  k2             迭代器                    context.write(k3,v3)
        //相同数据的key放在同一个reduce中   所以k2和k3都是一个东西
        
        // 对传进来的数据进行遍历iter+回车获取for循环
        int sum =0;//通过sum对v3求和
        for (IntWritable value : values) {
            //通过value.get()获取传进来的value
            //通过Ctrl+Alt+V使得value.get()获取一个整数类型的返回值
            int i = value.get();
            sum += i;
            v3.set(sum);//放一个和

        }


        context.write(key,v3);







    }
}

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5705772.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-17
下一篇2022-12-17

发表评论

登录后才能评论

评论列表(0条)

    保存