第三章 Spark RDD 弹性分布式数据集
3.3 RDD的处理过程
Spark用Scala语言实现了RDD的API,程序开发者可以通过调用API对RDD进行操作处理。下面,通过一张图来描述RDD的处理过程。
RDD经过一系列的"转换”操作,每一次转换都会产生不同的RDD,以供给下一次转换”操作使用,直到最后一个RDD经过“行动”操作才会被真正计算处理。
需要注意的是,RDD采用了惰性调用,即在RDD的处理过程中,真正的计算发生在RDD的"行动”操作,对于"行动"之前的所有"转换"操作,Spark只是记录下“转换”操作应用的一些基础数据集以及RDD相互之间的依赖关系,而不会触发真正的计算处理。
3.3.1 转换算子
RDD处理过程中的"转换"操作主要用于根据已有RDD创建新的RDD,每一次通过转换算子计算后都会返回一个新RDD,供给下一个转换算子使用。
转换算子 | 相关说明 |
---|---|
filtier(func) | 筛选出满足函数func的元素,并返回一个新的数据集 |
map(func) | 将每个元素传递到函数func中,返回的结果是一个新的数据集 |
flatMap(func) | 与map()相似,但是每个输入的元素都可以映射到0或者多个输出结果 |
groupByKey() | 应用于(Key,Value)键值对的数据集时,返回一个新的 (Key,lterable )形式的数据集 |
reduceByKey(func) | 应用于(Key,Value)键值对的数据集时,返回一个新的(Key,Value)形式的数据集。其中,每个Value值是将每个Key键传递到函数func中进行聚合后的结果 |
下面,我们通过结合具体的示例对这些转换算子API进行详细讲解。
● filter(fune)
filter(func)操作会筛选出满足函数func的元素,并返回一个新的数据集。假设,有一个文件test.txt(内容如文件3-1),下面,通过一张图来描述如何通过filter算子操作,筛选出包含单词“spark”的元素。
通过从test.txt文件中加载数据的方式创建RDD,然后通过filter操作筛选出满足条件的元素,这些元素组成的集合是—个新的RDD。接下来,通过代码来进行演示,具体代码如下:
scala> val lines=sc.textFile("file:///export/data/test.txt")
lines: org.apache.spark.rdd.RDD[String] = file:///export/data/test.txt MapPartitionsRDD[6] at textFile at <console>:24
scala> val linesWithSpark=lines.filter(line=>line.contains("spark"))
linesWithSpark: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[7] at filter at <console>:25
演示一下:
-
进入到hadoop01,进入/export/data目录
-
修改test.txt文件的内容与源数据保持一致(vi test.txt)。
-
进入到spark shell(参考之前的启动)。
-
加载文件并产生RDD.
● map(func)
map(func)操作将每个元素传递到函数func中,并将结果返回为一个新的数据集。假设,有一个文件test.txt,接下来,通过一张图来描述如何通过map算子操作把文件内容拆分成一个个的单词并封装在数组对象中,具体过程如图3-3所示。
通过从test.txt文件中加载数据的方式创建RDD,然后通过map操作将文件的每一行内容都拆分成一个个的单词元素,这些元素组成的集合是一个新的RDD。接下来,通过代码来进行演示,具体代码如下:
scala> val lines=sc.textFile("file:///export/data/test.txt")
lines: org.apache.spark.rdd.RDD[String] = file:///export/data/test.txt MapPartitionsRDD[9] at textFile at <console>:24
scala> var words=lines.map(line=>line.split(" "))
words: org