文章目录
- 1.四种Join操作
- 1.1 join
- 1.2 leftOuterJoin
- 1.3 rightOuterJoin
- 1.4 fullOuterJoin
- 2.Option对象
- 为什么要使用Option
1.四种Join操作
Join操作在特征提取的过程是一个经常使用的操作,当从多个数据源提取特征之后,使用Join操作将数据合并成一个完整的特征数据,以供后续的使用。
这里记录Spark中的四种Join操作的学习记录:
- join
- leftOuterJoin
- rightOuterJoin
- fullOuterJoin
注意:以上四种Join操作均是Spark中对PairRDD
的操作
为了讲清楚更加的形象的理解四种操作的效果,使用两个表格,后续笔记记录基于这两个表格
sexTable: RDD[(String, String)]
Name | Sex |
Tom | Male |
Pig | Female |
Apple | Male |
Kaggle | Male |
Que | Female |
ageTable: RDD[(String, String)]
Name | Age |
Tom | 15 |
Pig | 16 |
Apple | 17 |
Fey | 18 |
Wow | 19 |
1.1 join
- join函数输出两个RDD中相同Key的所有项(类似于SQL中的inner join)。
- 注意:join不满足交换律,就是说
sexTable.join(ageTable)
和ageTable.join(sexTable)
的结果是不一样的
sexTable.join(ageTable)
Name | Sex | Age |
Tom | Male | 15 |
Pig | Female | 16 |
Apple | Male | 17 |
ageTable.join(sexTable)
Name | Age | Sex |
Tom | 15 | Male |
Pig | 16 | Female |
Apple | 17 | Male |
1.2 leftOuterJoin
leftOuterJoin会保留对象的所有key,如sexTable.leftOuterJoin(ageTable)
保留了sexTable中的所有key,而且ageTable中的value部分转换为Option
对象保存
sexTable.leftOuterJoin(ageTable)
1 | 2 | 3 |
Tom | Male | Some(15) |
Pig | Female | Some(16) |
Apple | Male | Some(17) |
Kaggle | Male | None |
Que | Female | None |
1.3 rightOuterJoin
rightOuterJoin与leftOuterJoin,不过变成了保留参数对象的所有key
sexTable.rightOuterJoin(ageTable)
1 | 2 | 3 |
Tom | Some(Male) | 15 |
Pig | Some(Female) | 16 |
Apple | Some(Male) | 17 |
Fey | None | 18 |
Wow | None | 19 |
1.4 fullOuterJoin
fullOuterJoin中保留两个RDD中的所有key,因此所有的值列都可能出现缺失的情况,所有所有值列都转换为Option对象
sexTable.fullOuterJoin(ageTable)
1 | 2 | 3 |
Tom | Some(Male) | Some(15) |
Pig | Some(Female) | Some(16) |
Apple | Some(Male) | Some(17) |
Kaggle | Some(Male) | None |
Que | Some(Female) | None |
Fey | None | Some(18) |
Wow | None | Some(19) |
2.Option对象
Scala Option对象类型,从名字可以看得出来,它是用来表示一个值是可选的(有值或无值);
Option[T]是一个类型为 T 的可选值的容器(相当于这个容器的size只能是0或1):如果值存在Option[T]就是对象Some[T]; 如果不存在,Option[T]就是对象None
为什么要使用Option
《Java编程思想》中,作者说“万物皆对象”,但在Java中想要返回一个空对象时,返回的是一个Null
关键字。不知道大家是否有过疑问,为什么在希望返回一个对象的时候返回的是一个关键字?
为了让所有东西都是对象的目标更加一致,Scala中使用Option对象来代替可能出现的"空"的情况。
在scala中,None被声明为一个对象而不是一个类,因为我们只需要它的一个实例。
注意:如果对None使用 get()
方法,Scala一样会抛出一个 NoSuchElementException异常
参考文章1参考文章2