使用Java实现在单机上统计单词的数目

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zjq_1314520/article/details/63435829

准备

首先在IDE(eclipse或者IntelliJ IDEA)上面创建一个Java项目。导入F:\spark\spark-1.6.0-bin-hadoop2.6\lib\spark-assembly-1.6.0-hadoop2.6.0.jar这个jar包。

然后我们就可以开始写程序啦!
new一个class,比如取名就叫WordCount吧,生成main函数。
main函数中的代码生成步骤如下:

第一步

创建SparkConf 对象,并设置spark应用的一些信息

  • setAppName 设置应用名称
  • setMaster 设置Spark应用程序要连接的Spark集群的master结点的url,如果设置为local则表示在本地运行
        SparkConf conf = new SparkConf()
                .setAppName("WordCountApp")
                .setMaster("local");  

第二步

创建Java版本的SparkContext
SparkContext是Spark所有功能的一个入口
在不同类型的Spark应用程序中,使用的SparkContext是不同的:

  • Java:JavaSparkContext
  • scala:SparkContext
        JavaSparkContext sc = new JavaSparkContext(conf);

第三步

  • 读取我们输入的数据,数据来自数据源(本地文件或者hdfs文件等等),创建一个RDD。
  • 数据源中的数据会被打乱,然后而被分配到每个RDD的partitaon中去,从而形成一个初始的分布式数据集。
  • 下面程序中的textFile()方法是用于根据数据源来创建RDD(在Java中,创建的普通RDD被称为JavaRDD)。
  • 如果是本地文件或者hdfs文件,则RDD中的每一个元素相当于文件里面的一行。

注:RDD:弹性分布式数据集,是Spark对分布式数据和计算的基本抽象。

JavaRDD<String> lines = sc.textFile("E:/pythonProject/sparktest.txt");//这个来自文件

第四步

将每行切分为单词

        JavaRDD<String> words = lines.flatMap(new FlatMapFunction<String, String>() {

            private static final long serialVersionUID = 1L;
            @Override
            public Iterable<String> call(String line) throws Exception {
                return Arrays.asList(line.split(" "));  
            }

        });

第五步

转化为键值对并计算

  • 映射为(单词,1)这种形式,这样在后面才能根据单词作为key,来计算每个单词出现的次数。
  • mapToPair()方法:将每个元素转化为Tuple2类型的形式。
  • 下面程序中JavaPairRDD<String, Integer>中的参数是Tuple2的键值对类型。
  • 下面程序中的PairFunction<String, String, Integer>()中的参数分别代表:输入参数,Tuple2的键值对类型。
        JavaPairRDD<String, Integer> pairs = words.mapToPair(

                new PairFunction<String, String, Integer>() {

                    private static final long serialVersionUID = 1L;

                    @Override
                    public Tuple2<String, Integer> call(String word) throws Exception {
                        return new Tuple2<String, Integer>(word, 1);
                    }

                });

第六步

统计每个单词出现的次数

  • reduceByKey():通过key的值来减少JavaPairRDD<String, Integer>中元素的个数。
  • call():对相同key值的元素的value进行操作。如下面的程序return v1 + v2;就是将value的值相加,从而实现对单词的计数。
        JavaPairRDD<String, Integer> wordCounts = pairs.reduceByKey(

                new Function2<Integer, Integer, Integer>() {

                    private static final long serialVersionUID = 1L;

                    @Override
                    public Integer call(Integer v1, Integer v2) throws Exception {
                        return v1 + v2;
                    }

                });

第七部

输出统计结果

  • 之前我们进行的flatMapmapToPairreduceByKey操作被称为transformation操作。
  • 在一个Spark应用程序中,仅仅有transformation操作是不够的,还需要有action操作来触发程序的运行。
  • 下面程序的foreach方法就是一种action操作,来触发程序运行。
        wordCounts.foreach(new VoidFunction<Tuple2<String,Integer>>() {

            private static final long serialVersionUID = 1L;

            @Override
            public void call(Tuple2<String, Integer> wordCount) throws Exception {
                System.out.println("单词  "+wordCount._1 + "出现  " + wordCount._2 + " 次。");     
            }

        });

第八步

关闭JavaSparkContext

sc.close();

总结

以上就是一个用Java实现的Spark应用程序,用来统计一个文件中每个单词出现的次数的程序了!

展开阅读全文

没有更多推荐了,返回首页