RDD编程
Spark针对RDD的操作包括创建RDD,转换操作(返回RDD),行动操作(返回结果)
RDD创建
1:sc.parallelize(),需要把整个数据集加载到放在一台机器的内存中,多用于开发和原型测试
2:sc.textFile(),更常用的是从外部数据集的读取
从文件系统中加载数据创建RDD
textFile(),该方法把文件的URI作为参数,这个URI可以是本地文件系统,或者分布式文件系统HDFS的地址等等
from pyspark import SparkContext
sc = SparkContext( 'local[*]', 'test')
lines = sc.textFile("file:///usr/local/spark/mycode/wordcount/word.txt")
//lines = sc.textFile("hdfs://Master:9000/README.md")
1:如果使用使用本地文件系统的路径,那么必须保证在所有的worker节点上,也都能够采用相同的路径访问到该文件
2:textFile()方法的参数可能是文件名,目录或者压缩文件等
3:textFile()也可以接受第二个输入参数(可选,参数不可以小于HDFS设置的block大小),用来指定分区的数目。默认情况下,Spark会为HDFS的每个block创建一个分区
可以调用SparkContext的parallelize()方法,在Driver中一个已经存在的集合(数组)上创建:
from pyspark import SparkContext
sc = SparkContext( 'local[*]', 'test')
nums = [1,2,3,4,5]
rdd = sc.parallelize(nums)
RDD的操作
RDD支持两种操作转化操作和行动操作:
转化操作:返回一个新的RDD
行动操作:向驱动器程序返回结果或者把结果写入到外部系统
1:转化操作
通过转化操作,你从已有的RDD中派生出新的RDD,Spark会使用谱系图来记录这些不同RDD之间的依赖关系,Spark会根据这些信息按需计算每个RDD,也可以依靠谱系图在持久化的RDD丢失部分数据时恢复RDD 转换得到的RDD是惰性求值的,也就是说,整个转换过程只是记录了转换的轨迹,并不会发生真正的计算,只有遇到行动操作时,才会发生真正的计算,开始从血缘关系源头开始,进行物理的转换操作。
下面列出一些常见的转换操作(Transformation API):
filter(func):筛选出满足函数func的元素,并返回一个新的数据集
map(func):将每个元素传递到函数func中,并将结果返回为一个新的数据集
flatMap(func):与map()相似,但每个输入元素都可以映射到0或多个输出结果
groupByKey():应用于(K,V)键值对的数据集时,返回一个新的(K, Iterable)形式的数据集
reduceByKey(func):应用于(K,V)键值对的数据集时,返回一个新的(K, V)形式的数据集,其中的每个值是将每个key传递到函数func中进行聚合
2:行动操作
行动操作是真正触发计算的地方。Spark程序执行到行动操作时,才会执行真正的计算,从文件中加载数据,完成一次又一次转换操作,最终,完成行动操作得到结果。
下面列出一些常见的行动操作(Action API):
count() 返回数据集中的元素个数
collect() 以数组的形式返回数据集中的所有元素
first() 返回数据集中的第一个元素
take(n) 以数组的形式返回数据集中的前n个元素
reduce(func) 通过函数func(输入两个参数并返回一个值)聚合数据集中的元素
foreach(func) 将数据集中的每个元素传递到函数func中运行*