Spark的intersection
intersection顾名思义,他是指交叉的。当两个RDD进行intersection后,将保留两者共有的。因此对于RDD1.intersection(RDD2) 和RDD2.intersection(RDD1) 。应该是一致的。
比如对于,List1 = {1,2,3,4,5} 和 List1 = {3,4,5,6,7},对于包含这两个List的RDD来说,他们进行一次intersection应该得到result={3,4,5}
Spark的subtract
subtract则和intersection不同,他是找出两者之间不一致的内容。
比如对于,List1 = {1,2,3,4,5} 和 List1 = {3,4,5,6,7}他们进行一次subtract得到的结果是跟顺序有关的。
list1.subtract(list2)
复制代码
结果应该为
1 2
复制代码
而对于
list2.subtract(list1)
复制代码
结果应该为
6 7
复制代码
Spark的union
union最好理解,他是把两个RDD进行整合,但不考虑其中重复的情况。比如对于,List1 = {1,2,3,4,5} 和 List1 = {3,4,5,6,7}他们进行一次union得到的结果是跟顺序无关的。结果应该为
result = {1,2,3,4,5,3,4,5,6,7}
复制代码
Spark的distinct
distinc 是将RDD中重复的内容剔除,注意,这个剔除的过程并不会把重复的元素都去掉,而是重复的元素只保留一份。这当然很好理解,比如result = {1,2,3,4,5,3,4,5,6,7},进行一次distinct,则得到{1,2,3,4,5,6,7}
一个综合的例子
考虑到intersection、subtract、union和distinct比较常用,且在一个案例中能够很好体现其特点。因此我们这次获取的数据集是两个课程,lesson1和lesson2。lesson1中有十位同学,每个同学都有着许多个能力的估值,该估值是一个Int类型数据。lesson2中也是如此。对于这两个数据集我将其分别放在lesson1中和lesson2中。数据集和下面的代码均可以在github上找到并下载。
数据集分析
对于lesson1,里面有很多同学,每个同学又有很多次能力估值。在Spark入门(六)--Spark的combineByKey、sortBykey中已经提到过给每个人的成绩求平均分,因此这里不做这个处理。
这两个数据集我们解决如下的问题:
- 0、计算lesson1和lesson2中每个同学的能力总估值
- 1、找出lesson1中所有的同学(不重复)
- 2、找出lesson2中所有同学(不重复)
- 3、找出选了两门课程的同学
- 4、找出只在lesson1而不在lesson2中的同学
- 5、找出只在lesson2而不在lesson1中的同学
数据的部分内容展示
对于第0个问题,因为用到的并非本节的内容,因此标注为0。要求每个课程中的每个同学能力的总估值,首先要对数据进行处理,按空格拆分。拆分后的数据应该是(姓名,分数)的元组集合,然后根据姓名对分数进行累加。
-
第一个问题中找出lesson1中所有同学,只要得到了每个同学能力的总估值,去掉分数,即可知道lesson1中的所有同学。
-
第二题同理。
-
第三题要找出选了两门课的同学,则要对两门课所有的同学进行一次整合,然后剔除重复的数据,即先union再distinc
-
第四题要找到lesson1中而不在lesson二中的同学,则只要对lesson1的同学和lesson2中的同学进行一次substract即可
-
第五题同理
scala实现
import org.apache.spark.{SparkConf, SparkContext}
object SparkIntersectionAndSubtract {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setMaster("local").setAppName("SparkIntersectionAndSubtract")
val sc = new SparkContext(conf)
//课程一中的数据
val lesson1Data = sc.textFile(