Spark RDD是什么?
RDD(resilient Distributed Dataset)弹性分布式数据集,是spark中基本的计算(数据)抽象。它代表一个不可变,可分区,里面的元素可以并行(多个线程一起执行)计算的集合
装饰者模式是什么?
装饰者模式是设计模式其中的一种,是指在不改变原有对象的基础之上,将功能附加到对象上。提供了比继承更有弹性的替代方案(扩展原有对象功能)。简单来说,就是给对象添加一个功能,但并没有改变原有对象
RDD如何体现装饰者模式?
1.先用一段简单wordcount代码来引出RDD是如何体现装饰者模式
//需要统计列表中每个单词出现的个数
//创建一个列表
val list = List("hnswxy is very good","hello scala","hello java")
//创建SparkConf对象
val conf:SparkConf = new SparkConf().setMaster("local[*]").setAppName("wordCount01")
//创建Spark上下文对象,并将conf传入
val sc = new SparkContext(conf)
//从集合中创建RDD,并将集合传入
val rdd:RDD[String] = sc.makeRDD(list)
//将rdd对象进行扁平化操作,取出list中的每个元素
val rdd1:RDD[String] = rdd.flatMap(_.split(" "))
//将rdd1对象进行map操作,将字符串中每个单词转换为k-v形式,v为 1
val rdd2:RDD[(String,Int)] = rdd1.map(_ -> 1)
//将rdd2对象进行reduceByKey操作,将相同key值的value聚合
val rdd3:RDD[(String,Int)] = rdd2.reduceByKey(_+_)
//将最终结果打印
rdd3.collect().foreach(println)
运行结果
(scala,1)
(hnswxy,1)
(is,1)
(very,1)
(hello,2)
(java,1)
(good,1)
3.算子
①算子(operate):从认知心理学的角度看,解决问题其实是将问题的初始状态,通过一系列操作(算子)问题的状态进行转换,然后达到完成(解决)状态
②spark中所有的RDD方法都可以称之为算子,算子分为两大类:转换算子 行动算子
③由一个RDD转换到另一个RDD,可以通过丰富的算子实现,不再像MapReduce那样只能写map和redeuce了
3.可以从上述代码中看出:
先利用列表创建了一个RDD对象,然后不断的利用算子将RDD转换成另一个RDD,也就是将RDD装饰成另外一个RDD,原有的RDD并没有改变,这种RDD的转换就体现了装饰者模式。