我是靠谱客的博主 不安鸡翅,最近开发中收集的这篇文章主要介绍利用hadoop计算WordCount,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

这是一个简单的计算词频的程序,利用hadoop运行出结果。
简单的分析图:
这里写图片描述
代码如下:

import java.io.IOException;
import java.net.URI;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
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;

public class WordCount extends Configured implements Tool{
    @Override
    public int run(String[] args) throws Exception {
        //获取hadoop的系统配置
        Configuration conf = new Configuration() ;
        //加上URI可以在eclipse上运行改程序
        URI uri = new URI("hdfs://hadoop:9000") ;
        //获取文件系统的配置
        FileSystem fs = FileSystem.get(uri, conf) ;
        //输出文件的目录,结果文件存储的位置
        Path outPath = new Path("hdfs://hadoop:9000/ming/wordout") ;
        //输入文件的目录,含有单词的文件
        Path inPath = new Path("hdfs://hadoop:9000/ming/word.txt") ;
        //如果输出文件存在则删除,不能含有相同的输出文件目录
        if(fs.isDirectory(outPath)){
            fs.delete(outPath, true) ;
        }
        //创建一个工作的对象
        Job job = new Job(conf) ;
        job.setJarByClass(WordCount.class);
        //设置Mapper的类和输出格式
        job.setMapperClass(WCMapper.class);
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(LongWritable.class);
        //设置Reducer的类和输出格式
        job.setReducerClass(WCReducer.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(Text.class);
        //增加文件的输入和输出格式
        FileInputFormat.addInputPath(job, inPath);
        FileOutputFormat.setOutputPath(job, outPath);

        return job.waitForCompletion(true)?1:0;
    }


    public static void main(String[] args) throws Exception {
        //主函数的入口点
        int ec = ToolRunner.run(new Configuration(), new WordCount(), args);
        System.exit(ec);

    }

    public static class WCMapper extends Mapper<LongWritable,Text,Text,LongWritable>{
        @Override
        protected void map(LongWritable key,Text value,Context context) throws IOException, InterruptedException{
    //对每行的单词进行切分,以单词作为key,每个单词的词频为1作为value
            String[] line = value.toString().split("t") ;
            for(String s : line){
                context.write(new Text(s), new LongWritable(1));
            }
        }
    }


    public static class WCReducer extends Reducer<Text,LongWritable,Text,Text>{
        @Override
        protected void reduce(Text key,Iterable<LongWritable> values,Context context) throws IOException, InterruptedException{
        //计算每个单词的词频总数
            long sum = 0 ;
            for(LongWritable l:values){
                sum = sum + l.get();
            }
            context.write(key, new Text(String.valueOf(sum)));
        }
    }
}

最后

以上就是不安鸡翅为你收集整理的利用hadoop计算WordCount的全部内容,希望文章能够帮你解决利用hadoop计算WordCount所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(79)

评论列表共有 0 条评论

立即
投稿
返回
顶部