键值对RDD的创建
常用的键值对转换操作
reduceByKey(func)
groupByKey()
keys
values
sortByKey()
mapValues(func)
join
combineByKey
reduceByKey(func)
reduceByKey(func)的功能是,使用func函数合并具有相同键的值
groupByKey()
上面得到的wordCountsWithReduce和wordCountsWithGroup是完全一样的,但是,它们的内部运算过程是不同的
keys只会把Pair RDD中的key返回形成一个新的RDD
values只会把Pair RDD中的value返回形成一个新的RDD。
sortByKey()的功能是返回一个根据键排序的RDD
sortBy() ,false表示按降序排序。_._2表示每个键值对RDD元素的value
mapValues(func)
对键值对RDD中的每个value都应用一个函数,但是,key不会发生变化
join
join就表示内连接。对于内连接,对于给定的两个输入数据集(K,V1)和(K,V2),只有在两个数据集中都存在的key才会被输出,最终得到一个(K,(V1,V2))类型的数据集。
combineByKey
例:编程实现自定义Spark合并方案。给定一些销售数据,数据采用键值对的形式<公司,收入>,求出每个公司的总收入和平均收入,保存在本地文件
提示:可直接用sc.parallelize在内存中生成数据,在求每个公司总收入时,先分三个分区进行求和,然后再把三个分区进行合并。只需要编写RDD combineByKey函数的前三个参数的实现
//Combine.scala
import org.apache.spark.SparkContext
import org.apache.spark.SparkConf
object Combine {
def main(args: Array[String]) {
val conf = new SparkConf().setAppName("Combine").setMaster("local")
val sc = new SparkContext(conf)
val data = sc.parallelize(Array(("company-1",88),("company-1",96),("company-1",85),("company-2",94),("company-2",86),("company-2",74),("company-3",86),("company-3",88),("company-3",92)),3)
val res = data.combineByKey(
(income) => (income,1),
( acc:(Int,Int), income ) => ( acc._1+income, acc._2+1 ),
( acc1:(Int,Int), acc2:(Int,Int) ) => ( acc1._1+acc2._1, acc1._2+acc2._2 )
).map({ case (key, value) => (key, value._1, value._1/value._2.toFloat) })
res.repartition(1).saveAsTextFile("file:///usr/local/spark/mycode/rdd/result")
}
}
一个综合实例
题目:给定一组键值对("spark",2),("hadoop",6),("hadoop",4),("spark",6),键值对的key表示图书名称,value表示某天图书销量,请计算每个键对应的平均值,也就是计算每种图书的每天平均销量。