在之前的文章中,我们学习了如何在spark中使用键值对中的join,rightOuterJoin,leftOuterJoin三种方法。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下你宝贵的点赞,谢谢。
Spark-Scala语言实战(11)-CSDN博客文章浏览阅读670次,点赞27次,收藏16次。今天开始的文章,我会带给大家如何在spark的中使用我们的键值对方法,今天学习键值对方法中的join,rightOuterJoin,leftOuterJoin三种方法。希望我的文章能帮助到大家,也欢迎大家来我的文章下交流讨论,共同进步。https://blog.csdn.net/qq_49513817/article/details/137357301今天的文章开始,我会继续带着大家如何在spark的中使用我们的键值对里的方法。今天学习键值对方法中的keys和values,reduceByKey,groupByKey三种方法。
目录
一、知识回顾
二、键值对方法
1.keys和values
2.reduceByKey
3.groupByKey
拓展-方法参数设置
一、知识回顾
上一篇文章中我们学习了键值对的三种方法,分别是join,rightOuterJoin,leftOuterJoin。
join
join方法可以将两个RDD键值对进行内连接,它会将两个RDD键值对中拥有相同键的值进行连接。
rightOuterJoin方法是右外连接。只会包含右键值对的键,如果左边有右边的键,对应的值会连接。如果左边没有右边的键,就会显示None值(空值)。
leftOuterJoin与rightOuterJoin方法想法,它是左外连接,也就是如果右边有左边的键,对应的值会连接。如果右边没有左边的键,就会显示None值(空值)。
现在,开始今天的学习吧~
二、键值对方法
1.keys和values
- 键值对RDD,包含键和值两个部分。
- Spark提供了两种方法,分别获取键值对RDD的键和值。
- keys方法返回一个仅包含键的RDD。
- values方法返回一个仅包含值的RDD。
import org.apache.spark.{SparkConf, SparkContext}
object p1 {def main(args: Array[String]): Unit = {val conf=new SparkConf().setMaster("local").setAppName("p2")val sc=new SparkContext(conf)// 创建一个包含键值对的RDDval p = sc.parallelize(Seq(("a", 1), ("b", 2), ("c", 3), ("d", 4)))// 使用keys方法获取所有的键val p1 = p.keysp1.collect().foreach(println) // 输出:a, b, c, d// 使用values方法获取所有的值val p2 = p.valuesp2.collect().foreach(println) // 输出:1, 2, 3, 4}
}
可以看到我们创建了一个包含a,b,c,d四个元素的键与包含1,2,3,4四个元素的值,分别使用 keys与values获取它们对应的元素,那么键应该输出abcd,而值应该输出1234,现在运行代码。
与预期一致,快去试试吧~
2.reduceByKey
- 当数据集以键值对形式展现时,合并统计键相同的值是很常用的操作。
- reduceByKey()方法用于合并具有相同键的值,作用对象是键值对,并且只对每个键的值进行处理,当RDD中有多个键相同的键值对时,则会对每个键对应的值进行处理。
- reduceByKey()方法需要接收一个输入函数,键值对RDD相同键的值会根据函数进行合并并且创建一个新的RDD作为返回结果。
import org.apache.spark.{SparkConf, SparkContext}
object p1 {def main(args: Array[String]): Unit = {val conf=new SparkConf().setMaster("local").setAppName("p2")val sc=new SparkContext(conf)// 创建一个包含键值对的RDDval p = sc.parallelize(Seq(("a", 1), ("b", 2), ("a", 3), ("b", 4), ("c", 5)))// 使用reduceByKey方法将具有相同键的值进行相加val pp = p.reduceByKey((x, y) => x + y)// 收集结果并打印pp.collect().foreach(println)}
}
通过代码,我们创建了一个包含abc三个键的RDD,但a,b两个键对应有多个值,那么使用reduceByKey方法,就可以将具有相同键的值进行相加。那么a的值就应该是1+3=4,b的值2+4=6,c不变。
运行代码,可以看到与预期输出一致。
3.groupByKey
- groupByKey()方法用于对具有相同键的值进行分组,可以对同一组的数据进行计数、求和等操作。
- 对于一个由类型K的键和类型V的值组成的RDD,通过groupByKey()方法得到的RDD类型是[K,Iterable[V]]。
import org.apache.spark.{SparkConf, SparkContext}
object p1 {def main(args: Array[String]): Unit = {val conf=new SparkConf().setMaster("local").setAppName("p2")val sc=new SparkContext(conf)val p = sc.parallelize(Seq(("a", "1"), ("a", "3"), ("b", "6"), ("a", "7"), ("b", "2")))// 使用groupByKey方法将具有相同键的值分组val pp= p.groupByKey()// 收集结果并打印pp.collect().foreach(println)}
}
我们创建了一个包含ab两个键的RDD,它们分布有多个不同的值,使用groupByKey将它们进行分组的话,就会输出只有ab的两个键与多个值的组。
与预期一致,快去试试吧~
拓展-方法参数设置
方法 | 描述 | 参数 | 效果 | 属性 |
---|---|---|---|---|
keys | 提取键值对RDD中的键,形成新的RDD | 无 | 返回一个只包含键的新RDD | 不改变值的数量,只保留键 |
values | 提取键值对RDD中的值,形成新的RDD | 无 | 返回一个只包含值的新RDD | 不改变键的数量,只保留值 |
reduceByKey | 根据键对RDD中的值进行聚合操作,返回一个新的键值对RDD | 函数(用于聚合值) | 将具有相同键的值聚合在一起,应用提供的函数 | 减少输出的数量,只保留唯一的键和聚合后的值 |
groupByKey | 根据键对RDD中的值进行分组,返回一个新的键值对RDD,其中值是一个迭代器 | 无 | 将具有相同键的值分组在一起,值是一个包含所有相关值的迭代器 | 不减少输出的数量,但将相同键的值组合在一起 |