一、Spark RDD基础

1、Spark RDD是什么

Spark RDD是一个不可变的分布式对象集合,每个RDD都被分为多个分区,这些分区运行在集群中的不同节点上,进行并行化运算。

2、创建Spark RDD的两种方式

(1)读取外部数据集
如:val lines = sc.textFile(“words.txt”)
(2)在驱动器程序中对一个集合进行并行化
如:val lines = sc.parallelize(List(“you”,“are”,“wonderful”,“boy”,“girl”))

3、RDD的两种类型操作

区分RDD类型的一种方法是看函数的返回值类型,转化操作返回的是RDD,而行动操作返回的是其他数据类型。

(1)转化操作(transformation)
RDD的转化操作都是惰性求值的,这意味着当我们对RDD调用转化操作时,只是会派生出新的RDD,而不会立即执行运算。此时Spark会使用谱系图(lineage graph)来记录这些不同RDD之间的依赖关系。当调用行动操作时,Spark会根据这些信息来按需计算每个RDD。Spark也可以依靠谱系图在持久化的RDD丢失部分数据时恢复所丢失的数据。
(2)行动操作(action)
RDD的行动操作会对数据集进行实际的计算,并将最终求得的结果返回到驱动器程序或写入外部存储系统中。
每当调用一个新的行动操作时,整个RDD都会从头开始计算,为避免这种低效行为,可以将中间结果持久化。持久化方法可参考文章:



二、常用的RDD操作

1、转化操作

(1)map()
接收一个函数,把这个函数应用于RDD中的每个元素,将函数的返回结果作为结果RDD中对应元素的值。其返回值类型不需和输入类型一样。
(2)filter()
接收一个函数,将RDD中满足该函数的元素放入新的RDD中返回。
(3)flatMap()
与map类似,接收一个函数,把这个函数应用于RDD中的每个元素,而返回的并不是一个元素,而是一个返回值序列的迭代器,flatMap会将返回的迭代器“拍扁”,得到一个由各列表中元素组成的RDD。
(4)distinct()
用来生成一个只包含不同元素的新RDD,但是此操作的开销较大,因为需要将所有数据通过网络进行混洗(shuffle)。
(5)union()
并集,此操作会返回一个包含两个RDD中所有元素的RDD。如果输入的RDD中有重复数据,union操作也会包含这些重复数据。
(6)intersection()
交集,此操作只返回两个RDD中都有的元素,在运行时会去掉所有重复数据。性能比union差很多,因为要通过shuffle来发现共有元素。
(7)subtract()
差集,此函数接收另一个RDD作为参数,返回一个只存在于第一个RDD中而不存在于第二个RDD中的所有元素组成的RDD,需进行shuffle操作。
(8)cartesian()
笛卡尔集,此操作会返回所有可能的(a,b)对,其中a是源RDD中的元素,b则来自另一个RDD。RDD规模较大时此操作开销巨大。

2、行动操作

(1)collect()
此操作将整个RDD的内容返回到驱动器程序中,只有当程序把RDD筛选到一个很小的规模能在单台机器的内存中放得下时才可以使用。
(2)reduce()
接收一个函数作为参数,这个函数要操作两个相同元素类型的RDD数据并返回一个同样类型的新元素。返回值类型需要和所操作的RDD中元素类型相同。
(3)fold()
与reduce()类似,接收一个与reduce()接收的函数签名相同的函数,再加上一个“初始值”来作为每个分区第一次调用时的结果。返回值类型需要和所操作的RDD中元素类型相同。
(4)aggregate()
使用此函数时需要我们提供期待返回的类型的初始值,然后通过一个函数把RDD中的元素集合合并起来放入累加器,考虑到每个节点是在本地进行累加的,最终还需要提供第二个函数来将累加器两两合并。
(5)take(n)
返回RDD中的n个元素,并且尝试只访问尽量少的分区,因此该操作会得到一个不均衡的集合。
(6)top()
如果为数据定义了顺序,使用此函数可以从RDD中获取前几个元素。该函数会使用数据的默认顺序,也可以提供自己的比较函数。
(7)takeSample(withReplacement,num,seed)
可以从驱动器程序中对我们的数据进行采样,并指定是否替换。
(8)takeOrdered(num)(ordering)
从RDD中按照提供的顺序返回最前面的num个元素。
(9)foreach()
使用此函数可以对RDD中每个元素进行操作,比如将数据保存到数据库中,而不需要返回到驱动器程序中。
(10)count()
用来统计返回元素的个数。
(11)countByValue()
返回一个从各值到值对应的计数的映射表。

三、数值RDD操作

Spark的数值操作是通过流式算法实现的,允许以每次一个元素的方式构建出模型。这些统计数据都会在调用stats()方法时通过一次遍历数据计算出来,并以StatsCounter对象返回。常用的方法有:

方法

含义

count()

RDD中的元素个数

mean()

元素的平均值

sum()

总和

max()

最大值

min()

最小值

variance()

元素的方差

sampleVariance()

从采样中计算出的方差

stdev()

标准差

sampleStdev()

采样的标准差