[Spark] Scala集合类详解

    Spark常用Scala语言进行开发,Spark中的RDD处理过程中,经常会与Scala集合进行互相转换。

首先,盗一张图来说明Scala集合类的继承关系

Scala集合类的继承关系

由上图可知,Scala中集合主要分为三大类:

1. Seq,是一组有序的元素。 

2. Set,是一组没有重复元素的集合。 

3. Map,是一组k-v对。

说明:Scala中的集合类都有两种形式,即可变集合类型的不可变集合类型。可变集合类型即集合中的元素内容、个数是可以修改,而不可变集合类型即集合一旦定义,就不可以进行修改。

Set集合

Scala中的Set集合和其它语言类似,具有如下特点:

1. 不存在有重复的元素。 

2. 集合中的元素是无序的。即不能以索引的方式访问集合中的元素。 

首先,我们定义一个可变的Set集合,这里使用已经实现的HashSet类,如下:

val x = new mutable.HashSet[String]()

然后可以执行添加元素和删除元素功能:

x+="a"
x.add("d")
x++=Set("b","c")
x-="c"

执行结果如下:

image.png

我们再试试不可变集合,定义一个不可变集合,这里同样使用已经实现的HashSet类,如下:

val x = immutable.HashSet[String]("a","c","b")

因为是不可变信息,自然不能添加元素和删除元素,但可以进行如下的操作:

val y = x + "d" + "f"  // 增加新的元素,生成一个新的集合
val z = y - "a"  // 删除一个元素,生成一个新的集合
val a = Set(1,2,3)
val b = Set(1,4,5)
val c = a ++ b  // 生成一个新的集合,增加集合
val d = a -- b  // 生成一个新的集合,去除集合
val e = a & b // 与操作
val f = a | b // 或操作

执行结果如下:

image.png

Seq集合

Seq主要由两部分组成:IndexedSeq与LinearSeq。

首先看IndexedSeq,很容易看出来这种类型的主要访问方式是通过索引,默认的实现方式为vector。Seq集合也有可变和不可变之分。

创建一个不可变IndexdSeq,如下:

val x=immutable.IndexedSeq(1,2,3)

然后输出第一个元素:

println(x(0))

执行结果如下:

image.png

创建一个可变的IndexedSeq集合,如下:

val x=mutable.IndexedSeq(1,2,3)

其它操作这里就不再说明了。

而作为LinearSeq,主要的区别在于其被分为头与尾两部分。其中,头是容器内的第一个元素,尾是除了头元素以外剩余的其他所有元素。LinearSeq默认的实现是List。同样分可变和不可变。

创建不可变的LinearSeq使用下面的语句:

val x=immutable.LinearSeq("a", "b", "c")

创建可变的LinearSeq使用下面的语句:

val x=mutable.LinearSeq("a", "b", "c")

Map集合

Map这种数据结构是日常开发中使用非常频繁的一种数据结构。Map作为一个存储键值对的容器(key-value),其中key值必须是唯一的。 同样也分可变和不可变。

创建不可变的HashMap使用如下的语句:

val map = immutable.HashMap[String, String]("key1"->"value1","key2"->"value2")

创建可变的HashMap使用如下的语句:

val map = new mutable.HashMap[String, String]()

相应集合的其它操作这里不再说明。

0 条评论
发表一条评论