Spark---RDD的简单了解

RDD简单简绍

RDD的定义

RDD,全称为Resilient Distributed Datasets,是一个容错的,并行的数据结构,可以让用户显式地将数据存储到磁盘和内存中,并能控制数据的分区.

同时, RDD还提供了一组丰富的操作来操作这些数据.在这些操作中,诸如map,flatMap, filter等转换操作实现了Monad模式,很好地契合了Scala 的集合操作.除此之外, RDD还提供了诸如join,groupBy, reduceByKey等更为方便的操作,以支持常见的数据运算.

通常来讲,针对数据处理有几种常见模型,包括: ITterative Algorithms, Relational Queries, MapReduce, Stream Processing.例如Hadoop MapReduce采用了MapReduce模型, Storm则采用了Stream Processing模型. RDD混合了这四种模型,使得Spark可以应用于各种大数据处理场景.

RDD作为数据结构,本质上是一个只读的分区记录集合.一个RDD可以包含多个分区,每个分区就是一个DataSet片段.
RDD之间可以相互依赖,如果RDD的每个分区最多只能被一个子RDD的一个分区使用,则称之为窄依赖,若被多个子RDD的分区依赖,则称之为宽依赖.不同的操作依据其特性,可能会产生不同的依赖.例如 map.操作会产生窄依赖,而join.操作则产生宽依赖.

RDD的特点

  1. RDD是数据集
    在这里插入图片描述
    可以看成RDD存储的是文件里的数据,所有RDD是数据集
  2. RDD是编程模型
    在这里插入图片描述
    RDD中有很多的方法,因此看成是一个编程模型
  3. RDD相互之间有依赖关系
    在这里插入图片描述
    RDD2通过RDD1的flatMap方法得出来的,RDD3是通过RDD2的map方法得出来的,可见RDD间有相互的依赖关系
  4. RDD是可以分区的
    RDD是一个并行计算框架和分布式计算,所有她必须要有分区

RDD的创建方式

程序入口SparkContext

  1. SparkContext的简绍

SparkContext是spark-core的入口组件,是一个Spark程序的入口,在Spark 0.x版本就已经存在SparkContext 了,是一个元老级的API

如果把一个Spark程序分为前后端,那么服务端就是可以运行Spark程序的集群,而 Driver就是 Spark的前端,在 Driver 中SparkContext是最主要的组件,也是 Driver 在运行时首先会创建的组件,是 Driver的核心

SparkContext从提供的API来看,主要作用是连接集群,创建 RDD,累加器,广播变量等

  1. 创建SparkContext
  val conf = new SparkConf()
    .setMaster("local[6]")
    .setAppName("Create_RDD")
  val sc = new SparkContext(conf)

通过本地集合创建RDD

    //使用Seq创建RDD并且设置俩个分区
    val seq = Seq("Hello","Hi","NiHao")
    val rdd1: RDD[String] =  sc.parallelize(seq,2)
    //使用makeRDD创建
    val rdd2 = sc.makeRDD(seq,2)
    //俩者的区别,makeRDD必须要指定分区数

通过外部数据创建RDD

val rdd1: RDD[String] = sc.textFile("D:\\SP\\Soft")

通过RDD来衍生RDD

    val rdd1: RDD[Int] = sc.parallelize(Seq(1,2,3))
    //通过RDD衍生
    val rdd2: RDD[Int] = rdd1.map(item=>item)

常用的几个算子

Map算子


主要作用:将一份数据转换成另外一份数据
在这里插入图片描述
将value1、2、3以同一种形式转换成value’1,'2,'3

    //创建RDD
    val rdd1 = sc.parallelize(Seq(1,2,3))
    println(rdd1.foreach(println(_)))
    //执行map操作,将数据扩大10倍
    val rdd2 = rdd1.map(item=>item*10)
      .collect()
      .foreach(println(_))

在这里插入图片描述
解析
在这里插入图片描述

flatMap算子

    //创建RDD
    val rdd1 = sc.parallelize(Seq("hello world","hi Jack"))
    //转换,将数据以空格分割
    rdd1.flatMap(_.split(" "))
      .collect()
      .foreach(println(_))

在这里插入图片描述

思考map和flatMap的区别?

答:map转换是一对一,flatMap是一对多

ReduceByKey算子

流程图
在这里插入图片描述

按照key进行分组,然后开始自定义的操作

    //创建RDD
    val rdd1 = sc.parallelize(Seq("hello world", "hi world", "hello Rom"))
    //处理数据
    rdd1.flatMap(_.split(" "))
      .map(item => (item, 1))
      .reduceByKey((curr, agg) => curr + agg)
      .collect()
      .foreach(println(_))
    //关闭
    sc.stop()

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实验7中,我们学习到了如何使用Spark来进行编程实践,其中使用的是Scala语言。Spark是一个开源的分布式计算框架,它可以高效地处理大规模的数据集。 在实验中,我们首先学习了Spark的基本概念和架构。Spark使用了RDD(弹性分布式数据集)作为其核心数据结构,可以将数据集分布在集群的多个节点上,并通过并行计算来进行高效处理。我们还了解Spark的运行模式,包括本地模式和集群模式,并学习了如何设置和配置Spark的运行环境。 接着,我们学习了使用Scala语言编写Spark应用程序的方法。Scala是一种功能强大的静态类型编程语言,它可以与Java无缝集成,并且提供了很多简化编程的特性。我们学习了如何使用Scala的函数式编程特性来编写Spark应用程序,并通过实例演示了如何加载数据、转换数据以及进行数据分析和计算。 在实验中,我们还学习了Spark的常见操作和转换,包括map、reduce、filter、join等。这些操作可以帮助我们对数据进行各种复杂的计算和处理,而无需编写繁琐的循环和条件判断。我们还学习了如何使用Spark的持久化机制来优化计算性能,包括将数据缓存到内存中和将数据持久化到磁盘上。 最后,我们在实验中使用了Spark进行了几个实际的编程练习。通过这些练习,我们学习了如何在Spark中加载和处理不同类型的数据,包括文本数据、CSV文件和JSON数据。我们还学习了如何使用Spark进行数据清洗、数据转换和数据分析,并学习了如何使用Spark的机器学习库来进行简单的机器学习任务。 总的来说,实验7是一个非常实用和综合的实验,通过学习和实践,我们对Spark编程有了更深入的了解和掌握。同时,我们也学习到了如何使用Scala语言来编写高效的分布式计算程序。这些知识和技能对于我们在实际工作中处理大数据和进行分布式计算非常有帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值