学习目标:
熟悉 Spark RDD 的使用方法。
学习原理:
RDD(Resilient Distributed Datasets)可扩展的弹性分布式数据集,RDD是spark最基本的数据抽象,RDD表示一个只读、分区且不变的数据集合,是一种分布式的内存抽象,与分布式共享内存(Distributed Shared Memory,DSM)都是分布式的内存抽象,但两者是不同的。RDD支持两种类型的操作: transformations(转换)和 actions(动作)。transformations操作会在一个已存在的 RDD上创建一个新的 RDD,但实际的计算并没有执行,仅仅记录操作过程,所有的计算都发生在actions环节。actions操作触发时,会执行 RDD记录的所有运行transformations操作,并计算结果,结果可返回到 driver 程序,也可保存的相关存储系统中。
RDD产生背景
为了解决开发人员能在大规模的集群中以一种容错的方式进行内存计算,提出了 RDD 的概念,而当前的很多框架对迭代式算法场景与交互性数据挖掘场景的处理性能非常差, 这个是RDDs 的提出的动机。
什么是 RDD
RDD 是 Spark 的计算模型。RDD(Resilient Distributed Dataset)叫做弹性的分布式数据集合,是 Spark 中最基本的数据抽象,它代表一个不可变、只读的,被分区的数据集。操作 RDD 就像操作本地集合一样,有很多的方法可以调用,使用方便,而无需关心底层的调度细节。
RDD的五个主要属性
分区信息
Compute函数
Partitioner函数
优先位置列表
依赖关系
RDD的基本操作
1)RDD创建
pyspark
从列表创建 RDD
data=[1,2,6,4,7,3]
rdd=sc.parallelize(data)
rdd.collect()
从文本文件创建 RDD
distFile=sc.textFile("/home/ubuntu/Desktop/book.txt")
type(distFile)
2)RDD 转换
#count 操作,返回RDD中元素的个数。
sc.parallelize([2,3,4]).count()
#countByKey 操作,每个键对应的元素的个数,返回数据类型为字典类型
rdd=sc.parallelize([("a",1),("b",1),("a",1)])
sorted(rdd.countByKey().items())#countByValue,返回RDD中每一个唯一值的个数,返回类型为字典类型
sorted(sc.parallelize([1,2,1, 2, 2], 2).countByValue().items())
#distinct,去除RDD中重复的元素。
sorted(sc.parallelize([1,1,2,3]).distinct().collect())
# filter,过滤符合自定义条件的 RDD元素
rdd=sc.parallelize([1,2, 3, 4,5])
rdd.filter(lambda x:x%2== 0).collect()#first,返回RDD中的第一个元素,当RDD 为空时抛出RDD为空的异常。
sc.parallelize([2,3, 4]).first()
sc.parallelize([]).first()
#flatMap,对RDD每个输入元素生成多个输出元素,和 map() 类似,我们提供给 flatMap() 的函数被分别应用到了输入 RDD 的每个元素上。不 过返回的不是一个元素,而是一个返回值序列的迭代器。
rdd=sc.parallelize([2,3, 4])
sorted(rdd.flatMap(lambda x:range(1,x)).collect())sorted(rdd.flatMap(lambda x:[(x,x), (x,x)]).collect())
#foreach,对 RDD内的每一个元素进行处理,可以自定义处理函数,将函数名作为参数传递
def f(x): print(x)
sc.parallelize([1,2, 3,4,5]).foreach(f)#groupBy,按照自定义条件对 RDD内的元素进行分组
rdd=sc.parallelize([1,1, 2, 3,5,8])
result= rdd.groupBy(lambda x:x% 2).collect()
sorted([(x,sorted(y)) for (x,y) in result])
#isEmpty,判断 RDD是否为空sc.parallelize([]).isEmpty()
#map,对 RDD内的每一个元素进行并行处理。
rdd=sc.parallelize(["b","a","c"])
sorted(rdd.map(lambda x: (x,1)).collect())#reduceByKey,把相同键的数据加和起来
from operator import add
rdd=sc.parallelize([("a", 1), ("b", 1), ("a",1)])
sorted(rdd.reduceByKey(add).collect())