数据源:
小米,华为,小米,三星,苹果,华为,华为,酷派
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(); } }
结果: