spark常用RDD操作,操作包括两种类型,即转换(Transformation)操作和行动(Action)操作
一、转换操作(Transformation)
1、filter(func)
筛选出满足函数func的元素,并返回一个新的数据集
例:
val lines=sc.textFile("file:///usr/local/spark/mycode/rdd/word.txt")
val linesWithspark=lines.filter(line => line.contians("Spark"))
该操作表示依次取出lines这个RDD中的每个元素,对于当前取到的元素,把它赋值给表达式中满足的line变量,执行函数lines.contains(“Spark”),如果lines中包含“spark”这个单词,就把这个元素加入到新的RDD变量(linesWithspark)中。
2、map(func)
将每个元素传递到函数func中,并将结果返回为一个新的数据集。
例:
val data=Array(1,2,3,4,5)
val rdd1= sc.parallelize(data) //将data创建生成RDD
val rdd2=rdd1.map(x->+10)
该操作表示通过创建的Array数组生成的RDD(rdd1),执行rdd1.map(x->+10)表示依次取出这五个元素,对于取到的元素x+10,返回新的值作为一个元素放入到新的额RDD(rdd2),·最终生成的RDD包含五个元素,即(11,12,13,14,15)
3、fiatMap(func)
与map()相似,但每个输入元素都可以映射到0到多个输出结果。
例如:
val lines = sc.textfile("file:///usr/local/spark/mycode/rdd/word.txt") //word.txt中元素均为String类型,即每个RDD元素就是一行文本
val words= lines.flatMap(line=>line.split(" "))
该操作表示使用生成的RDD(lines),执行lines.flatMap(lines=>line.split(" "),等价于两个操作结果,先将lines中元素按照空格分成多个元素生成多个RDD,如 "I like spark"执行生成“I”、“like”、“spark”,三个RDD元素,将lines中RDD全部转换完成之后,再将每个RDD加入到同一块区中,比如lines中有三个RDD(“I love hadoop”,“I love spark ”,“spark is good ”),转换后每个RDD中又有三个RDD,最后将所有RDD整合在一起,得到
(“I”, “I”, “spark”,
“love”, “love”, “is”,
“hadoop”,“spark”,“good”)
4、groupByKey()
在一个(K,V)对组成的数据集上调用,返回一个(K,Iterable)形式的数据集。
将所有形同的key,归并为一个新的键值对。
例:
sc.parallelize(Seq(("a", 1), ("a", 1), ("b", 1)))
.groupByKey()
.collect()
5、reduceByKey(func)
reduceByKey(func)应用于(K,V)键值对的数据集时,返回一个新的(K,V)形成的数据集,其中的每个值是将每个key传递到函数func中进行聚合后得到的结果,总的来说就是计算每个key的个数。
例:
sc.parallelize(Seq(("a", 1), ("a", 1), ("b", 1)))
.reduceByKey( (curr, agg) => curr + agg )
.collect()
二、行动操作(action)
1、count()
返回数据集中的元素个数。
2、collect()
以数组形式返回数据集中的所有元素
3、first()
返回数据集中的第一个元素
4、take(n)
以数组的形式返回数据集中的前n个元素
5、reduce(func)
通过函数func(输入两个参数并返回一个值)聚合数据集中的元素
val rdd = sc.parallelize(Seq(("手机", 10.0), ("手机", 15.0), ("电脑", 20.0)))
val result = rdd.reduce((curr, agg) => ("总价", curr._2 + agg._2))
println(result)
结果计算出总价45.0。
6、foreach(func)
将数据集中的每个元素传递到函数func中进行,遍历每一个元素,可后加println()输出元素
7、countByKey()
求得整个数据集中 Key 以及对应 Key 出现的次数
val rdd = sc.parallelize(Seq(("手机", 10.0), ("手机", 15.0), ("电脑", 20.0)))
val result = rdd.countByKey()
println(result)
求得整个数据集中 Key 以及对应 Key 出现的次数