文章目录

  • 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

spark的聚合操作 spark中join操作_Apple

为什么要使用Option

《Java编程思想》中,作者说“万物皆对象”,但在Java中想要返回一个空对象时,返回的是一个Null关键字。不知道大家是否有过疑问,为什么在希望返回一个对象的时候返回的是一个关键字?
为了让所有东西都是对象的目标更加一致,Scala中使用Option对象来代替可能出现的"空"的情况。
在scala中,None被声明为一个对象而不是一个类,因为我们只需要它的一个实例。

注意:如果对None使用 get()方法,Scala一样会抛出一个 NoSuchElementException异常

参考文章1参考文章2