spark学习(六)Java版RDD基本的基本操作
1.map算子
private static void map() {
        //创建SparkConf
        SparkConf conf = new SparkConf()
                .setAppName("map")
                .setMaster("local");  
        //创建JavasparkContext
        JavaSparkContext sc = new JavaSparkContext(conf);  
        //构造集合
        List<Integer> numbers = Arrays.asList(1,2,3,4,5);  
        //并行化集合,创建初始RDD
        JavaRDD<Integer> numberRDD = sc.parallelize(numbers);  
        //使用map算子,将集合中的每个元素都乘以2
        JavaRDD<Integer> multipleNumberRDD = numberRDD.map(new Function<Integer, Integer>() {
            @Override
            public Integer call(Integer v1) throws Exception {
                return v1 * 2;
            }
        });
        //打印新的RDD
        multipleNumberRDD.foreach(new VoidFunction<Integer>() {
            @Override
            public void call(Integer t) throws Exception {
                System.out.println(t);
            }
        });
        //关闭JavasparkContext
        sc.close();
    }
2.filter算子
private static void filter() {
        //创建SparkConf
        SparkConf conf = new SparkConf()
                    .setAppName("filter")
                    .setMaster("local");  
        //创建JavaSparkContext
        JavaSparkContext sc = new JavaSparkContext(conf);  
        //模拟集合
        List<Integer> numbers = Arrays.asList(1,2,3,4,5,6,7,8,9,10);  
        //并行化集合,创建初始RDD
        JavaRDD<Integer> numberRDD = sc.parallelize(numbers);  
        //对集合使用filter算子,过滤出集合中的偶数
        JavaRDD<Integer> evenNumberRDD = numberRDD.filter(new Function<Integer, Boolean>() {
            @Override
            public Boolean call(Integer v1) throws Exception {
                return v1%2==0;
            }
        });
        evenNumberRDD.foreach(new VoidFunction<Integer>() {
            @Override
            public void call(Integer t) throws Exception {
                System.out.println(t);
            }  
        });
        sc.close();
    }
3.flatMap算子
Spark 中 map函数会对每一条输入进行指定的操作,然后为每一条输入返回一个对象;
而flatMap函数则是两个操作的集合——正是“先映射后扁平化”:
操作1:同map函数一样:对每一条输入进行指定的操作,然后为每一条输入返回一个对象
操作2:最后将所有对象合并为一个对象
private static void flatMap() {
        SparkConf conf = new SparkConf()
            .setAppName("flatMap")
            .setMaster("local");  
        JavaSparkContext sc = new JavaSparkContext(conf);  
        List<String> lineList = Arrays.asList("hello you","hello me","hello world");  
        JavaRDD<String> lines = sc.parallelize(lineList);  
        //对RDD执行flatMap算子,将每一行文本,拆分为多个单词
        JavaRDD<String> words = lines.flatMap(new FlatMapFunction<String, String>() {
            //在这里,传入第一行,hello,you
            //返回的是一个Iterable<String>(hello,you)
            @Override
            public Iterable<String> call(String t) throws Exception {
                return Arrays.asList(t.split(" "));
            }
        });  
        words.foreach(new VoidFunction<String>() {
            @Override
            public void call(String t) throws Exception {
                System.out.println(t);
            }
        });
        sc.close();
    }
4.groupByKey算子
private static void groupByKey() {
        SparkConf conf = new SparkConf()
                .setAppName("groupByKey")
                .setMaster("local");
        JavaSparkContext sc = new JavaSparkContext(conf);
        List<Tuple2<String, Integer>> scoreList = Arrays.asList(
                new Tuple2<String, Integer>("class1", 80),
                new Tuple2<String, Integer>("class2", 90),
                new Tuple2<String, Integer>("class1", 97),
                new Tuple2<String, Integer>("class2", 89));  
        JavaPairRDD<String, Integer> scores = sc.parallelizePairs(scoreList);
        //针对scoresRDD,执行groupByKey算子,对每个班级的成绩进行分组
        //相当于是,一个key join上的所有value,都放到一个Iterable里面去了
        JavaPairRDD<String, Iterable<Integer>> groupedScores = scores.groupByKey();
        groupedScores.foreach(new VoidFunction<Tuple2<String,Iterable<Integer>>>() {  
            @Override
            public void call(Tuple2<String, Iterable<Integer>> t)
                    throws Exception {
                System.out.println("class:" + t._1);
                Iterator<Integer> ite = t._2.iterator();
                while(ite.hasNext()) {
                    System.out.println(ite.next());
                }
            }
        });
    }
5.reduceByKey算子
private static void reduceByKey() {
        SparkConf conf = new SparkConf()
                .setAppName("reduceByKey")
                .setMaster("local");  
        JavaSparkContext sc = new JavaSparkContext(conf);
        List<Tuple2<String, Integer>> scoreList = Arrays.asList(
                new Tuple2<String, Integer>("class1", 80),
                new Tuple2<String, Integer>("class2", 90),
                new Tuple2<String, Integer>("class1", 97),
                new Tuple2<String, Integer>("class2", 89));  
        JavaPairRDD<String, Integer> scores = sc.parallelizePairs(scoreList);  
        //reduceByKey算法返回的RDD,还是JavaPairRDD<key,value>
        JavaPairRDD<String, Integer> totalScores = scores.reduceByKey(new Function2<Integer, Integer, Integer>() {
            @Override
            public Integer call(Integer v1, Integer v2) throws Exception {
                return v1 + v2;
            }
        });  
        totalScores.foreach(new VoidFunction<Tuple2<String,Integer>>() {
            @Override
            public void call(Tuple2<String, Integer> t) throws Exception {
                System.out.println(t._1 + ":" + t._2);  
            }
        });
        sc.close();
    }
6.sortByKey算子
private static void sortByKey() {
        SparkConf conf = new SparkConf()
                .setAppName("sortByKey")
                .setMaster("local");  
        JavaSparkContext sc = new JavaSparkContext(conf);  
        List<Tuple2<Integer, String>> scoreList = Arrays.asList(
                new Tuple2<Integer, String>(78, "marry"),
                new Tuple2<Integer, String>(89, "tom"),
                new Tuple2<Integer, String>(72, "jack"),
                new Tuple2<Integer, String>(86, "leo"));  
        JavaPairRDD<Integer, String> scores = sc.parallelizePairs(scoreList);  
        JavaPairRDD<Integer, String> sortedScores = scores.sortByKey();
        sortedScores.foreach(new VoidFunction<Tuple2<Integer,String>>() {
            @Override
            public void call(Tuple2<Integer, String> t) throws Exception {
                System.out.println(t._1 + ":" + t._2);
            }
        });
        sc.close();
    }
7.join算子
join算子用于关联两个RDD,join以后,会根据key进行join,并返回JavaPairRDD。JavaPairRDD的第一个泛型类型是之前两个JavaPairRDD的key类型,因为通过key进行join的。第二个泛型类型,是Tuple2<v1, v2>的类型,Tuple2的两个泛型分别为原始RDD的value的类型
private static void join() {
        SparkConf conf = new SparkConf()
                .setAppName("join")
                .setMaster("local");  
        JavaSparkContext sc = new JavaSparkContext(conf);  
        List<Tuple2<Integer, String>> studentList = Arrays.asList(
                new Tuple2<Integer, String>(1, "tom"),
                new Tuple2<Integer, String>(2, "jack"),
                new Tuple2<Integer, String>(3, "marry"),
                new Tuple2<Integer, String>(4, "leo"));  
        List<Tuple2<Integer, Integer>> scoreList = Arrays.asList(
                new Tuple2<Integer, Integer>(1, 78),
                new Tuple2<Integer, Integer>(2, 87),
                new Tuple2<Integer, Integer>(3, 89),
                new Tuple2<Integer, Integer>(4, 98));  
        //并行化两个RDD
        JavaPairRDD<Integer, String> students = sc.parallelizePairs(studentList);;
        JavaPairRDD<Integer, Integer> scores = sc.parallelizePairs(scoreList);  
        //使用join算子关联两个RDD
        //join以后,会根据key进行join,并返回JavaPairRDD
        //JavaPairRDD的第一个泛型类型,之前两个JavaPairRDD的key类型,因为通过key进行join的
        //第二个泛型类型,是Tuple2<v1, v2>的类型,Tuple2的两个泛型分别为原始RDD的value的类型
        JavaPairRDD<Integer, Tuple2<String, Integer>> studentScores = students.join(scores);  
        //打印
        studentScores.foreach(new VoidFunction<Tuple2<Integer,Tuple2<String,Integer>>>() {
            @Override
            public void call(Tuple2<Integer, Tuple2<String, Integer>> t)
                    throws Exception {
                System.out.println("student id:" + t._1);
                System.out.println("student name:" + t._2._1);
                System.out.println("student score:" + t._2._2);
                System.out.println("==========================");
            }
        });
        sc.close();
    }
更深的方法参见:
http://blog.csdn.net/liulingyuan6/article/details/53397780
http://blog.csdn.net/liulingyuan6/article/details/53410832
https://www.2cto.com/net/201608/543044.html
spark学习(六)Java版RDD基本的基本操作的更多相关文章
- Hbase深入学习(六) Java操作HBase
		
Hbase深入学习(六) ―― Java操作HBase 本文讲述如何用hbase shell命令和hbase java api对hbase服务器进行操作. 先看以下读取一行记录hbase是如何进行工作 ...
 - Spark学习(一)--RDD操作
		
标签(空格分隔): 学习笔记 Spark编程模型的两种抽象:RDD(Resilient Distributed Dataset)和两种共享变量(支持并行计算的广播变量和累加器). RDD RDD是一种 ...
 - Spark学习笔记2:RDD编程
		
通过一个简单的单词计数的例子来开始介绍RDD编程. import org.apache.spark.{SparkConf, SparkContext} object word { def main(a ...
 - Spark学习(二)——RDD的设计与运行原理
		
Spark的核心是建立在统一的抽象RDD之上,使得Spark的各个组件可以无缝进行集成,在同一个应用程序中完成大数据计算任务.RDD的设计理念源自AMP实验室发表的论文<Resilient Di ...
 - spark学习(2)---RDD
		
一.打印RDD内容 https://blog.csdn.net/wengyupeng/article/details/52808503 1.方法 2种方式: 1 rdd.collect().forea ...
 - 布隆过滤器(Bloom Filter)-学习笔记-Java版代码(挖坑ing)
		
布隆过滤器解决"面试题: 如何建立一个十亿级别的哈希表,限制内存空间" "如何快速查询一个10亿大小的集合中的元素是否存在" 如题 布隆过滤器确实很神奇, 简单 ...
 - 多线程编程学习六(Java 中的阻塞队列).
		
介绍 阻塞队列(BlockingQueue)是指当队列满时,队列会阻塞插入元素的线程,直到队列不满:当队列空时,队列会阻塞获得元素的线程,直到队列变非空.阻塞队列就是生产者用来存放元素.消费者用来获取 ...
 - Spark菜鸟学习营Day1  从Java到RDD编程
		
Spark菜鸟学习营Day1 从Java到RDD编程 菜鸟训练营主要的目标是帮助大家从零开始,初步掌握Spark程序的开发. Spark的编程模型是一步一步发展过来的,今天主要带大家走一下这段路,让我 ...
 - [转]Spark学习之路 (三)Spark之RDD
		
Spark学习之路 (三)Spark之RDD https://www.cnblogs.com/qingyunzong/p/8899715.html 目录 一.RDD的概述 1.1 什么是RDD? ...
 
随机推荐
- c++ 递归求一个数的阶乘
			
#include <iostream> using namespace std; long factorial(int value); int main() { int value; co ...
 - struts2命名空间与访问路径
			
比如项目deom的struts.xml中有如下片段 Java代码 <package name="demo" extends="struts-default" ...
 - redis:高可用分析
			
https://www.cnblogs.com/xuning/p/8464625.html 基于内存的Redis应该是目前各种web开发业务中最为常用的key-value数据库了,我们经常在业务中用其 ...
 - laravel服务容器(IOC控制反转,DI依赖注入),服务提供者,门脸模式
			
laravel的核心思想: 服务容器: 容器:就是装东西的,laravel就是一个个的对象 放入:叫绑定 拿出:解析 使用容器的目的:这里面讲到的是IOC控制反转,主要是靠第三方来处理具体依赖关系的解 ...
 - day12-图
 - 2017 ACM/ICPC Asia Regional Qingdao Online
			
Apple Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submi ...
 - spring实战 — spring数据库事务
			
欢迎加入程序员的世界,添物科技为您服务. 欢迎关注添物网的微信(微信号:tianwukeji),微博(weibo.com/91tianwu/),或下载添物APP,及时获取最新信息. 免费加入QQ群:5 ...
 - RESTful API接口
			
我所理解的RESTful Web API [设计篇] 百度:RESTful restful一种软件架构风格.设计风格,而不是标准,只是提供了一组设计原则和约束条件.它主要用于客户端和服务器交互类的软件 ...
 - [Kubernetes]深入解析Pod
			
Pod是Kubernetes项目的原子调度单位 为什么需要Pod? 容器是未来云计算系统中的进程,容器镜像就是这个系统里的".exe"安装包,那Kubernetes就是操作系统. ...
 - 【Luogu】P1410子序列(DP)
			
题目链接 我DP是真的菜啊啊啊啊啊! f[i][j]表示考虑前i个数,有i-j+1个数组成一个上升子序列,且不以i结尾的尾端最小值. 设a为j个数组成的序列,且以i结尾:b为i-j+1个数组成的序列, ...