引言:
该部分内容主要是学习常见的几个RDD算子,并且通过几个综合示例来加强理解。RDD是一个只读的,可分区的分布式数据集,可以全部内容或部分内容缓存在内存。
RDD编程基础
转换算子:每一次转换(Transformation)操作都会产生新的RDD,但是RDD的转换过程是惰性求值的,所以说转换操作只记录转换过程,不实际计算。只有发生行动操作时才进行计算,常用算子如下:
fileter(func):筛选满足函数func的元素,并返回一个新的数据集
val lines=sc.textFile(“file:///usr/java/test/word.txt”)
val word=lines.fileter(line=>line.contains(“spark”))
map(func):将每个元素传递到func中。
val Array1=Array(1,2,3,4,5)
val rdd1=sc.parallelize(Array1)
val rdd2=rdd1.map(x=>x+1)
flatMap(func):与map()相似,先做map操作,然后再做flat(拍扁)操作
val lines=sc.textFile(“file:///usr/java/test/word.txt”)
val word=lines.flatMap(line=>line.split(“ ”))
groupByKey():应用于(K,V)键值对的数据集,返回一个新的(K,Iterable)形式的数据集,Iterable是一种可迭代的集合。groupByKey把所有key相同的value都组织成一个value-list,保存在一个可迭代的集合Iterable中。RDD中每个元素都是(key,valuelist)的形式:
(is,CompactBuffer(1, 1))
(ove,CompactBuffer(1))
(hello,CompactBuffer(1))
(hahah,CompactBuffer(1))
(not,CompactBuffer(1))
(spark,CompactBuffer(1, 1, 1))
(hadoop,CompactBuffer(1))
(I,CompactBuffer(1))
(lm,CompactBuffer(1))
(good,CompactBuffer(1, 1))
reduceByKey(func):应用于(K,V)键值对的数据集,返回一个新的(K,V)形式的数据集,其中每个值都是将每个Key传递到函数func中进行聚合后得到的结果。
行动算子:行动操作才是真正计算的地方。
count():返回数据集中的元素个数
val rdd=sc.parallelize(Array(1,2,3))
rdd.count()
输出:Long=5
collect:以数组的形式返回数据集中的所有元素
val rdd=sc.parallelize(Array(1,2,3))
rdd.collect()
输出:Array[Int] = Array(1, 2, 3)
first():回数据集第一个元素。
take(n):以数组的形式返回前n个
reduce(func):通过函数func聚合数据集中的元素
val rdd=sc.parallelize(Array(1,2,3))
rdd.reduce((a,b)=>a+b)
输出:int=15
foreach(func):将数据集中的每个元素传递到函数func中运行
val rdd=sc.parallelize(Array(1,2,3))
rdd.foreach(elem=>print(elem))
持久化算子:由于spark的惰性机制,导致每次遇到行动操作,都会触发一次从头开始的计算,这样加大了计算量。因此当需要使用同一组数据时,往往采用持久化计算来简化计算量。
综合实例:将本地一个文件word.txt进行词频统计,文件由多行英语单词组成
val lines=sc.textFile(“file:///usr/java/test/word.txt”)
val rdd1=lines.flatMap(line=>line.split(“ ”))
val rdd2=rdd1.map(word=>(word,1))
val rdd3=rdd2.reduceByKey((a,b)=>a+b)
rdd3.collect
rdd3.foreach(println)
键值对操作:
reduceByKey(),同上
groupByKey(),同上
keys:键值对RDD每个元素都是(Key,Value)的形式,keys操作只会把键值对中的key返回
rdd.key.foreach(println)
输出:
values:values操作只会把键值对中的key返回
sortByKey():默认是升序排列,通过key进行排序
如果想降序排列,形式sortByKey(false)即可
sortBy:sortByKey可以根据rdd中的key值进行排列,但无法对value值进行排列故设置sortBy(_._2)表示对value进行排序
d1.reduceByKey((a,b)=>a+b).sortBy(_._2).collect
mapValues(func):mapVales是对rdd中的每个value都应用一个函数,但是,key不会变化
d1.mapValues(x=>x+1)
join():表示内连接,对于两个输入数据集(K,V1)和(K,V2),只有在两个rdd数据集都存在的key才会被输出,最终获得一个(k,(v1,v2))类型的数据集