Spark学习笔记(二):RDD编程基础
系列博客是学习厦门大学林子雨老师spark编程基础课程的笔记,方便回顾
系列博客:
-
RDD创建
(1)从文件中加载数据创建
调用SparkContext的textFile()
lines=sc.textFile("word.txt")
lines.foreach(print)
(2)通过并行集合(列表)创建RDD
调用SparkContext的parallelize方法
array=[1,2,3,4,5]
rdd=sc.parallelize(array)
rdd.foreach(print)
-
RDD操作
转换操作(transformation)
转换得到的RDD是惰性求值的,整个转换过程只是记录了转换的路线,并不会进行真正的计算
(1) filter(func) 筛选出满足函数func的元素,并返回一个新的数据集
lines = sc.textFile("word.txt")
#筛选包含"Spark"字符串的语句
linesWithSpark = lines.filter(lambda line: "Spark" in line)
linesWithSpark.foreach(print)
(2)map(func) 将每个元素传递到函数func中,并将结果返回为一个新的数据集
data = [1,2,3,4,5]
rdd1 = sc.parallelize(data)
#整体加上10,和python中DataFrame的map函数类似
rdd2 = rdd1.map(lambda x:x+10)
rdd2.foreach(print)
(3)flatmap(func)
lines = sc.textFile("file:///usr/local/spark/mycode/rdd/word.txt")
words = lines.flatMap(lambda line:line.split(" "))
(4) groupByKey() 应用于(K,V)键值对的数据集时,返回一个新的(K, Iterable)形式的数据集
words = sc.parallelize([("Hadoop",1),("is",1),("good",1), \
("Spark",1),("is",1),("fast",1),("Spark",1),("is",1),("better",1)])
words1 = words.groupByKey()
words1.foreach(print)
5.reduceByKey(func) 应用于(K,V)键值对的数据集时,返回一个新的(K, V)形式的数据集,其中的每个值是将每个key传递到函数func中进行聚合后得到的结果
words = sc.parallelize([("Hadoop",1),("is",1),("good",1),("Spark",1), \
("is",1),("fast",1),("Spark",1),("is",1),("better",1)])
words1 = words.reduceByKey(lambda a,b:a+b)
words1.foreach(print)
转换函数总结:
行动操作(action)
转换操作是惰性的,需要行动操作来逼它触发真正的计算
行动函数:
(1)count() 返回数据集中的元素个数
(2)collect() 以数组的形式返回数据集中的所有元素
(3)first() 返回数据集中的第一个元素
(4)take() 以数组的形式返回数据集中的前n个元素
(5)reduce() 通过函数func(输入两个参数并返回一个值)聚合数据集中的元素
(6)foreach() 将数据集中的每个元素传递到函数func中运行
-
持久化
在Spark中,RDD采用惰性求值的机制,每次遇到行动操作,都会从头开始执行计算。每次调用行动操作,都会触发一次从头开始的计算。
持久化方法:
- 将RDD作为反序列化的对象存储于JVM中,如果内存不足,就要按照LRU原则替换缓存中的内容
- 表示将RDD作为反序列化的对象存储在JVM中,如果内存不足,超出的分区将会被存放在硬盘上
感谢和推荐林子雨老师的课程: 厦门大学林子雨老师spark编程基础