Spark计算关键字出现的次数 Java形式

数据源:

小米,华为,小米,三星,苹果,华为,华为,酷派

  

Java代码:

public class WorkCount {
    public static void main(String[] a) {
        SparkConf conf = new SparkConf();
        //指定运行模式
        /**
         * local(本地模式):常用于本地开发测试,本地还分为local单线程和local-cluster多线程
         standalone(集群模式):典型的Mater/slave模式,不过也能看出Master是有单点故障的;Spark支持ZooKeeper来实现 HA
         on yarn(集群模式): 运行在 yarn 资源管理器框架之上,由 yarn 负责资源管理,Spark 负责任务调度和计算
         on mesos(集群模式): 运行在 mesos 资源管理器框架之上,由 mesos 负责资源管理,Spark 负责任务调度和计算
         on cloud(集群模式):比如 AWS 的 EC2,使用这个模式能很方便的访问 Amazon的 S3;Spark 支持多种分布式存储系统:HDFS 和 S3
         */
        conf.setMaster("local");
        //定义Job名
        conf.setAppName("app");
        JavaSparkContext context = new JavaSparkContext(conf);
        //指定文件地址
        JavaRDD<String> javaRDD = context.textFile("resource/test.txt");
        /**
         * <String, Integer>
         *     String 指定要解析的数据类型
         *     Integer  指定要被转换成什么类型
         */
        JavaRDD<String> flatMap = javaRDD.flatMap(new FlatMapFunction<String, String>() {
            public Iterator<String> call(String s) throws Exception {
                //指定数据源是以什么形式分割的,分割,并转换成Iterator类型
                return Arrays.asList(s.split(",")).iterator();
            }
        });
        //将解析的词变成键值对
        /**
         * <String, String, Integer>
         *  String 要转换的词类型
         *  String 转换成的key类型
         *  Integer转换成的value类型
         */
        JavaPairRDD<String, Integer> pairRDD = flatMap.mapToPair(new PairFunction<String, String, Integer>() {
            public Tuple2<String, Integer> call(String s) throws Exception {
                /**
                 * new Tuple2<String, Integer>(s,1)
                 * s 要转换的词
                 * 1 变成1(后面使相同kay的value相加计算出现的次数)
                 */
                return new Tuple2<String, Integer>(s, 1);
            }
        });
        /**
         * 类似与MR中的Reduce操作
         * new Function2<Integer, Integer, Integer>
         *     Function2 表示有两个参数传进来,若是有三个就是Function3,依次类推
         *     Integer, Integer 前两个Integer表示相邻的value为Integer型
         *     第三 个Integer表示结果也是Integer型
         */
        JavaPairRDD<String, Integer> reduceByKey = pairRDD.reduceByKey(new Function2<Integer, Integer, Integer>() {
            public Integer call(Integer integer, Integer integer2) throws Exception {
                //当key相同,value怎么处理
                return integer + integer2;
            }
        });
        //遍历
        reduceByKey.foreach(new VoidFunction<Tuple2<String, Integer>>() {
            public void call(Tuple2<String, Integer> stringIntegerTuple2) throws Exception {
                System.out.println("key:" + stringIntegerTuple2._1 + " value:" + stringIntegerTuple2._2);
            }
        });
        //也可以用collect方法返回迭代器遍历
//        List<Tuple2<String, Integer>> collect = reduceByKey.collect();
//        for (Tuple2<String,Integer> tu:collect){
//            System.out.println("key:" + tu._1 + " value:" + tu._2);
//        }
        context.close();
    }
}

 

结果:

 

posted @ 2018-03-13 15:29  猴子1  阅读(255)  评论(0编辑  收藏  举报