基于Java的Spark WordCount编程实现

来源:互联网 发布:青年政治学院 知乎 编辑:程序博客网 时间:2024/05/24 07:12

刚开始接触Spark编程,以WordCount作为入门编程实例,WordCount是用于统计单词出现的次数。本文参考http://blog.csdn.net/gongpulin/article/details/51534754,不同的是本文以Java语言实现实例的编程实现。

a、案例分析
对于词频数统计,用 Spark 提供的算子来实现,我们首先需要将文本文件中的每一行转化成一个个的单词, 其次是对每一个出现的单词进行记一次数,最后就是把所有相同单词的计数相加得到最终的结果。
对于第一步我们自然的想到使用 flatMap 算子把一行文本 split 成多个单词,然后对于第二步我们需要使用 map 算子把单个的单词转化成一个有计数的 Key-Value 对,即 word -> (word,1). 对于最后一步统计相同单词的出现次数,我们需要使用 reduceByKey 算子把相同单词的计数相加得到最终结果。

b、编程实现

import org.apache.spark.SparkConf;import org.apache.spark.api.java.JavaPairRDD;import org.apache.spark.api.java.JavaRDD;import org.apache.spark.api.java.JavaSparkContext;import org.apache.spark.api.java.function.FlatMapFunction;import org.apache.spark.api.java.function.Function2;import org.apache.spark.api.java.function.PairFunction;import scala.Tuple2;import scala.actors.threadpool.Arrays;import java.util.ArrayList;import java.util.List;import java.util.regex.Pattern;/** * Created by Administrator on 2017/10/30. */public class WordCount {    private static final Pattern SPACE = Pattern.compile(" ");    public static void main(String[] args) throws Exception {    SparkConf conf =new SparkConf().setAppName("WordCount").setMaster("local");        JavaSparkContext sc = new JavaSparkContext(conf);        //数据内容        List<String> dataList = new ArrayList<String>();        dataList.add("one,one,two,hello,world");        dataList.add("hello,world,one,two,three");        JavaRDD<String> list1 = sc.parallelize(dataList);        //数据分片        JavaRDD<String> words = list1.flatMap(new FlatMapFunction<String, String>() {            @Override            public Iterable<String> call(String s) throws Exception {                return Arrays.asList(s.split(","));            }        });        //数据转化为 对        JavaPairRDD<String,Integer> wordsMap = words.mapToPair(new PairFunction<String, String, Integer>() {            @Override            public Tuple2<String, Integer> call(String s) throws Exception {                return new Tuple2(s,1);            }        });        //求和        JavaPairRDD<String,Integer> wordsReduce = wordsMap.reduceByKey(new Function2<Integer, Integer, Integer>() {            @Override            public Integer call(Integer arg0, Integer arg1) throws Exception {                return arg0 + arg1;            }        });        //将RDD类型转化为List类型        List<Tuple2<String, Integer>> output = wordsReduce.collect();        for (Tuple2<?, ?> tuple : output) {            System.out.println(tuple._1() + ": " + tuple._2());        }        sc.stop();    }}

c、运行结果
这里写图片描述

结束语

通过本文,完成基于Java对WordCount简单实例的编程实现,理解每一句代码含义,打好基础。

由于时间仓促并且本人知识水平有限,如有遗漏甚至是错误的地方,希望各位朋友不吝赐教。有任何问题,都可以在文末留下您的评论,我会及时回复。

原创粉丝点击