基于Java的Spark WordCount编程实现

刚开始接触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简单实例的编程实现,理解每一句代码含义,打好基础。

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

猜你喜欢

转载自blog.csdn.net/fengzhimohan/article/details/78523677