使用java语言实现spark的wordCount入门程序

虽然spark使用scala写的,所以使用scala来编写spark程序很正常,但是大部分情况下还是使用java语言来编写spark程序。

学了scala之后就是为了能读懂spark源码!

下面是程序:

package com.john.spark;

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 org.junit.Test;
import scala.Serializable;
import scala.Tuple2;

import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

public class JavaSpark01 implements Serializable {

    @Test
    public void testJavaSpark () {

        //1.创建Spark的配置对象SparkConf,设置本地运行spark和程序名称
        SparkConf sparkConf = new SparkConf().setAppName("spark_java01").setMaster("local[2]");

        //2.创建SparkContext对象,SparkContext是Spark程序所有功能的唯一入口(java:JavaSparkContext)
        JavaSparkContext sc = new JavaSparkContext(sparkConf);
        //设置日志输出级别
        sc.setLogLevel("WARN");

        //3.读取文件
        JavaRDD lineRdd = sc.textFile("D:\\Develop\\spark\\javaSpark\\input");

        /**
         * 4.对每一行内容进行切分
         * new FlatMapFunction两个string分别代表输入和输出类型
         * Override的call方法需要自己实现一个转换的方法,并返回一个Iterable的结构
         *
         * flatmap属于一类非常常用的spark函数,简单的说作用就是将一条rdd数据使用你定义的函数给分解成多条rdd数据
         *
         */
        JavaRDD wordsRdd = lineRdd.flatMap(new FlatMapFunction() {
            public Iterator call(String s) throws Exception {

                String[] words = s.split(" ");

                return Arrays.asList(words).iterator();
            }
        });

        /**
         * 5.对切分的单词进行标注
         * map 键值对 ,类似于MR的map方法
         * pairFunction: T:输入类型;K,V:输出键值对
         * 需要重写call方法实现转换
         */
        JavaPairRDD wordAndOneRdd = wordsRdd.mapToPair(new PairFunction() {

            public Tuple2 call(String s) throws Exception {
                //将单词进行标记:
                return new Tuple2(s, 1);
            }
        });

        /**
         * 6.计算单词出现次数
         * reduceByKey方法,类似于MR的reduce
         * 要求被操作的数据(即下面实例中的ones)是KV键值对形式,该方法会按照key相同的进行聚合,在两两运算
         */
        JavaPairRDD wordAndCountRdd = wordAndOneRdd.reduceByKey(new Function2() {
            public Integer call(Integer v1, Integer v2) throws Exception {
                return v1 + v2;
            }
        });

        //7.排序
        JavaPairRDD sortedRdd = wordAndCountRdd.sortByKey();

        //8.collect方法用于将spark的RDD类型转化为我们熟知的java常见类型
        List> finalResult = sortedRdd.collect();

        //9.打印单词及次数
        for (Tuple2 tuple2 : finalResult) {
            System.out.println(tuple2._1 + "---->" + tuple2._2);
        }

        //10.保存单词及次数到磁盘文件中
        sortedRdd.saveAsTextFile("D:\\Develop\\spark\\javaSpark\\output");

        //11.关闭sparkContxt
        sc.stop();

        }

}

需要注意:在flatMap方法中的call方法中的返回结果(return Arrays.asList(words).iterator();)

有的情况下需要后面跟.iterator()才可以,否则转换不成功!网上有的答案直接是:return Arrays.asList(words);

你可能感兴趣的:(技术,云计算大数据)