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"
执行结果如下:
我们再试试不可变集合,定义一个不可变集合,这里同样使用已经实现的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 // 或操作
执行结果如下:
Seq集合
Seq主要由两部分组成:IndexedSeq与LinearSeq。
首先看IndexedSeq,很容易看出来这种类型的主要访问方式是通过索引,默认的实现方式为vector。Seq集合也有可变和不可变之分。
创建一个不可变IndexdSeq,如下:
val x=immutable.IndexedSeq(1,2,3)
然后输出第一个元素:
println(x(0))
执行结果如下:
创建一个可变的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]()
相应集合的其它操作这里不再说明。