Spark-Scala语言实战(13)

这篇具有很好参考价值的文章主要介绍了Spark-Scala语言实战(13)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在之前的文章中,我们学习了如何在spark中使用键值对中的keys和values,reduceByKey,groupByKey三种方法。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下你宝贵的点赞,谢谢。

Spark-Scala语言实战(12)-CSDN博客文章浏览阅读722次,点赞19次,收藏15次。今天开始的文章,我会带给大家如何在spark的中使用我们的键值对方法,今天学习键值对方法中的keys和values,reduceByKey,groupByKey三种方法。希望我的文章能帮助到大家,也欢迎大家来我的文章下交流讨论,共同进步。https://blog.csdn.net/qq_49513817/article/details/137385224今天的文章开始,我会继续带着大家如何在spark的中使用我们的键值对里的方法。今天学习键值对方法中的fullOuterJoin,zip,combineByKey三种方法。

目录

一、知识回顾

二、键值对方法

1.fullOuterJoin

2.zip

3.combineByKey

拓展-方法参数设置


一、知识回顾

 上一篇文章中我们学习了键值对的三种方法,分别是keys和values,reduceByKey,groupByKey。

keys和values分别对应了我们的键与值。

Spark-Scala语言实战(13),spark,scala,大数据,bigdata,数据分析

我们可以用它们来创建我们的RDD

 reduceByKey可以进行统计,将有相同键的值进行相加,统一输出。

Spark-Scala语言实战(13),spark,scala,大数据,bigdata,数据分析

而 groupByKey方法就是对我们的键值对RDD进行分组了

Spark-Scala语言实战(13),spark,scala,大数据,bigdata,数据分析

它可以将我们的相同的键,不同的值组合成一个组。

那么,开始今天的学习吧~ 

二、键值对方法

1.fullOuterJoin

  •  fullOuterJoin()方法用于对两个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)
    // 创建两个RDD(弹性分布式数据集)
    val p1 = sc.parallelize(Seq(("a1", "1"), ("a2", "2"), ("a3", "3")))
    val p2 = sc.parallelize(Seq(("a2", "A"), ("a3", "B"), ("a4", "C")))
    // 将RDD转换为键值对
    val pp1 = p1.map { case (key, value) => (key, value) }
    val pp2 = p2.map { case (key, value) => (key, value) }
    // 执行fullOuterJoin操作
    val ppp = pp1.fullOuterJoin(pp2)
    // 收集结果并打印
    ppp.collect().foreach(println)
    }
}

我们的代码创建了两个键值对RDD,那么使用 fullOuterJoin方法全外连接那么两个键值对都会连接。

Spark-Scala语言实战(13),spark,scala,大数据,bigdata,数据分析

可以看到两个键值对里的键与值都连接上了,互相没有的值即显示None值。 

2.zip

  • zip()方法用于将两个RDD组合成键值对RDD,要求两个RDD的分区数量以及元素数量相同,否则会抛出异常。
  • 将两个RDD组合成Key/Value形式的RDD,这里要求两个RDDpartition数量以及元素数量都相同,否则会抛出异常
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)
    // 创建两个RDD
    val p1 = sc.parallelize(Seq(1, 2, 3))
    val p2 = sc.parallelize(Seq("a", "b", "c"))
    // 使用zip方法将两个RDD组合在一起
    val pp1 = p1.zip(p2)
    val pp2 = p2.zip(p1)
    // 收集结果并打印
    pp1.collect().foreach(println)
    pp2.collect().foreach(println)
    }
}

 代码创建了两个不同的RDD键值对,分别使用p1zip方法p2与p2zip方法p1,那么它们输出的结果会是一样的吗?

Spark-Scala语言实战(13),spark,scala,大数据,bigdata,数据分析Spark-Scala语言实战(13),spark,scala,大数据,bigdata,数据分析

可以看到是不一样的,谁在前面谁就是键,反之是值。 

3.combineByKey

  • combineByKey()方法是Spark中一个比较核心的高级方法,键值对的其他一些高级方法底层均是使用combineByKey()方法实现的,如groupByKey()方法、reduceByKey()方法等。
  • combineByKey()方法用于将键相同的数据聚合,并且允许返回类型与输入数据的类型不同的返回值。
  • combineByKey()方法的使用方式如下。
    • combineByKey(createCombiner,mergeValue,mergeCombiners,numPartitions=None)
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 p1 = sc.parallelize(Seq(("a", 1), ("b", 2), ("a", 3), ("b", 4), ("c", 5)))
    val p2 = p1.combineByKey(
      // createCombiner: 将第一个值转换为累加器
      (v: Int) => v,
      // mergeValue: 将新的值加到累加器上
      (c: Int, v: Int) => c + v,
      // mergeCombiners: 合并两个累加器
      (c1: Int, c2: Int) => c1 + c2
    )
    p2.collect().foreach { case (key, value) =>
      println(s"Key: $key, Value: $value")
    }
  }
}

我的代码中: 

createCombiner: 这个函数定义了如何将每个键的第一个值转换为初始的累加器值。 

代表着每个键,第一个出现的值将作为累加器的初始值。

mergeValue: 这个函数定义了如何将新值与当前的累加器值合并。在我的代码中,我将新值与累加器相加。

代表着每个键的后续值,它们都会被加到当前的累加器值上。

mergeCombiners: 这个函数定义了当两个累加器(对应于同一个键但可能来自不同的分区)需要合并时应该执行的操作。在我的代码中,也是将两个累加器值相加

这确保了无论数据如何在分区之间分布,最终每个键都会得到正确的累加结果。

看看输出效果

Spark-Scala语言实战(13),spark,scala,大数据,bigdata,数据分析

可以看到我们的键值对成功累加。

快去试试吧~ 文章来源地址https://www.toymoban.com/news/detail-844559.html

拓展-方法参数设置

方法 参数 描述 例子
fullOuterJoin otherRDD 另一个要与之进行全外连接的RDD rdd1.fullOuterJoin(rdd2)
fullOuterJoin numPartitions 结果RDD的分区数(可选) rdd1.fullOuterJoin(rdd2, numPartitions=10)
zip otherRDD 要与之进行zip操作的另一个RDD rdd1.zip(rdd2)
combineByKey createCombiner 处理第一个出现的每个键的值的函数 lambda v: (v, 1)
combineByKey mergeValue 合并具有相同键的值的函数 lambda acc, v: (acc[0] + v, acc[1] + 1)
combineByKey mergeCombiners 合并两个累积器的函数 lambda acc1, acc2: (acc1[0] + acc2[0], acc1[1] + acc2[1])
combineByKey numPartitions 结果RDD的分区数(可选) rdd.combineByKey(createCombiner, mergeValue, mergeCombiners, numPartitions=5)

到了这里,关于Spark-Scala语言实战(13)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spark-Scala语言实战(12)

    在之前的文章中,我们学习了如何在spark中使用键值对中的join,rightOuterJoin,leftOuterJoin三种方法。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下你宝贵的点赞,谢谢。 Spark-Scala语言实战(11)-CSDN博客 文章浏览阅读670次,

    2024年04月14日
    浏览(40)
  • Spark-Scala语言实战(7)

    在之前的文章中,我们学习了如何在IDEA中导入jars包,并做了一道例题,了解了RDD。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下你宝贵的点赞,谢谢。 Spark-Scala语言实战(6)-CSDN博客 文章浏览阅读695次,点赞15次,

    2024年04月15日
    浏览(42)
  • Spark-Scala语言实战(8)

    在之前的文章中,我们学习了如何在spark中使用RDD方法的map,sortby,collect。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下你宝贵的点赞,谢谢。 Spark-Scala语言实战(7)-CSDN博客 文章浏览阅读802次,点赞22次,收藏8次。​

    2024年04月11日
    浏览(32)
  • Spark-Scala语言实战(15)

    在之前的文章中,我们学习了如何在spark中使用键值对中的学习键值对方法中的lookup,cogroup两种方法。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下你宝贵的点赞,谢谢。 Spark-Scala语言实战(14)-CSDN博客 文章浏览阅

    2024年04月15日
    浏览(38)
  • Spark-Scala语言实战(9)

    之前的文章中,我们学习了如何在spark中使用RDD方法的flatMap,take,union。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下你宝贵的点赞,谢谢。 Spark-Scala语言实战(8)-CSDN博客 文章浏览阅读675次,点赞16次,收藏10次。​今

    2024年04月15日
    浏览(31)
  • Spark大数据分析与实战笔记(第一章 Scala语言基础-3)

    对于每一门编程语言来说,数组(Array)都是重要的数据结构之一,主要用来存储数据类型相同的元素。Scala中的数组分为定长数组和变长数组,定义定长数组,需要使用new,而定义变长数组时,则需要导包 import scala.collection.mutable.ArrayBuffer 。 数组(Array)主要用来存储

    2024年02月10日
    浏览(39)
  • Spark大数据分析与实战笔记(第一章 Scala语言基础-2)

    Spark是专为大规模数据处理而设计的快速通用的计算引擎,它是由Scala语言开发实现的,关于大数据技术,本身就是计算数据,而Scala既有面向对象组织项目工程的能力,又具备计算数据的功能,同时Spark和Scala的紧密集成,本书将采用Scala语言开发Spark程序,所以学好Scala将有助

    2024年02月11日
    浏览(40)
  • Spark大数据分析与实战笔记(第一章 Scala语言基础-1)

    Spark是专为大规模数据处理而设计的快速通用的计算引擎,它是由Scala语言开发实现的,关于大数据技术,本身就是计算数据,而Scala既有面向对象组织项目工程的能力,又具备计算数据的功能,同时Spark和Scala的紧密集成,本书将采用Scala语言开发Spark程序,所以学好Scala将有助

    2024年02月11日
    浏览(40)
  • 大数据Spark SparkSession的3种创建方式 Scala语言实现

    SparkSession是Apache Spark 2.0版本引入的一个编程接口,用于与Spark进行交互。它是Spark应用程序的入口点,提供了一种方便的方式来创建DataFrame、DataSet和SQLContext等数据结构,并且可以配置各种Spark应用程序的选项。SparkSession还管理了Spark应用程序的运行环境,包括Spark集群的连接,

    2023年04月20日
    浏览(25)
  • spark底层为什么选择使用scala语言开发

    基于Scala的语言特性 集成性:Scala 是一种运行在 Java 虚拟机(JVM)上的静态类型编程语言,可以与 Java 代码无缝集成。由于 Spark 涉及到与大量 Java 生态系统的交互,例如 Hadoop、Hive 等,使用 Scala 可以方便地与这些组件进行集成和交互。 函数式编程支持:Scala 是一种面向函数

    2024年02月10日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包