RDD编程

RDD编程

一、RDD编程基础

1、RDD创建

Spark采用textFile()方法从文件系统中加载数据创建RDD,该方法把文件的URI作为参数,这个URI可以是本地文件系统的地址、分布式文件系统HDFS的地址或者是AmazonS3地址等。

(1)从文件系统中加载数据

在这里插入图片描述
(2)从分布式文件系统HDFS中加载数据

在这里插入图片描述

(3)通过并行集合(列表)创建RDD

在这里插入图片描述

2.RDD操作

RDD操作包含两种类型,即转换(Transformation)操作和行动(Action)操作

(1)转换操作

操作含义
filter(func)筛选出满足函数func的元素,并返回一个新的数据集
map(func)将每个元素传递到函数func中,并将结果返回为一个新的数据集
flatMap(func)与map()相识,但每个输入元素都可以映射到0或多个输出结果
groupByKey()应用于(K,V)键值对的数据集时,返回一个新的(K,Iterable)形式的数据集
reduceByKey(func)应用于(K,V)键值对的数据集时,返回一个新的(K,K)形式的数据集,其中每个值是将每个key传递到函数func中进行聚合后的结果

例:

  • filter()

在这里插入图片描述

  • map()

在这里插入图片描述

  • flatMap()

"flat"是一个很形象的动作-----“拍扁”,也就是把wordArray中的每个RDD元素都“拍扁”成多个元素,所有这些被拍扁以后得到的元素,构成一个新的RDD。

在这里插入图片描述

  • groupByKey()

在这里插入图片描述

  • reduceByKey()

在这里插入图片描述

(2)行动操作

行动操作是真正触发计算的地方。Spark程序只有执行到行动操作时,才会执行真正的计算,从文件中加载数据,完成一次又一次转换操作,最终,完成行动操作得到结果。

操作含义
count()返回数据集中的元素个数
collect()以数组的形式返回数据集中的所有元素
first()返回数据集中的第1个元素
take(n)以数组的形式返回数据集中的前n个元素
reduce(func)通过函数func(输入两个参数并返回一个值)聚合数据集中的元素
foreach(func)将数据集中的每个元素传递到函数func中运行

在这里插入图片描述

3.惰性机制

惰性机制是指整个转换过程只是记录了转换的轨迹,并不会发生真正的计算,只有遇到行动操作时,才会触发“从头到尾”的真正计算。

4.持久化

我们知道RDD采用惰性机制,这对于迭代计算而言,代价是很大的,因为迭代计算经常需要多次重复使用同一组数据。

为了解决这一问题,我们可以通过持久化(缓存)机制来避免这种重复计算的开销。具体方法是使用persist()方法将一个RDD标记为持久化。

一般而言,使用cache()方法时,会调用persist()。
持久化RDD会占用内存空间,当不再需要一个RDD时,就可以使用unpersist()方法手动地把持久化的RDD从缓存中移除,释放内存空间。

在这里插入图片描述

很明显时间缩短了很多。

5.分区

(1)分区的作用

RDD是弹性分布式数据集,通常RDD很大,会被分成很多个分区,分别保存在不同的节点上。

对RDD进行分区,第一个作用是增加并行度。

在这里插入图片描述

如:rdd2的3个分区p6、p7、p8,分布在3个不同的工作节点WorkerNode2、WorkerNode3、WorkerNode4上,就可以在这三个工作节点分别启动3个线程对这3个分区的数据进行并行处理,增加任务的并行度。

第二个作用是减少通信开销。

(2)分区的原则

RDD分区的一个原则是时得分区的个数尽量等于集群中CPU核心(Core)数目。对于不同的Spark部署模式,都可以通过设置spark.default.parallelism这个参数的值,来配置默认的分区数目。

设置分区的个数

创建RDD时手动指定分区个数

sc.textFile(path,partitionNum)
#path参数用于指定加载的文件的地址,partitionNum参数用于指定分区个数

使用repartition方法重新设置分区个数

在这里插入图片描述

自定义分区方法

Spark提供了自带的HashPartition(哈希分区)与RangePartition(区域分区),能够满足大多数应用场景的需求。

二、键值对RDD

键值对RDD是指每个RDD元素都是(Key,Values)键值对类型,是一种常见的RDD类型,可以应用于很多场景。

1.键值对RDD的创建

键值对RDD的创建主要有两种方式:从文件中加载生成RDD;通过并行集合(列表)创建RDD。

这和上面RDD创建类似,就是我们要对每个key值赋一个values。

例:

在这里插入图片描述

2.常用的键值对转换操作

reduceByKey()和groupByKey()上面已经介绍过,接下来介绍:

keys、values、sortByKey()、sortBy()、mapValues(func)、join()等

  • keys

键值对RDD每个元素都是(Key,Values)的形式,keys方法啊只会把键值对RDD中的key返回,形成一个新的RDD。
在这里插入图片描述

  • values

values操作只会把键值对RDD中的values返回,形成一个新的RDD。

在这里插入图片描述

  • sortByKey()

    sortByKey()的功能是返回一个根据key排序的RDD。
    在这里插入图片描述
    在这里插入图片描述

  • sortBy()

可以根据其他字段进行排序。

在这里插入图片描述

  • mapValues(func)

mapValues(func)对键值对RDD中每个value都应用一个函数,但是,key不会发生变化。

在这里插入图片描述

  • join()

join表示内连接,对于给定的两个输入数据集(K,V1),(K,V2),只有在两个数据集中都存在的key才会被输出,最终得到一个(K,(V1,V2))类型的数据集。

在这里插入图片描述

  • 4
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spark Streaming RDD 编程主要涉及到以下几个方面: 1. 创建 StreamingContext 对象:首先需要创建一个 StreamingContext 对象,设置应用程序名称、批处理间隔等参数。 ```scala val conf = new SparkConf().setAppName("Streaming example") val ssc = new StreamingContext(conf, Seconds(1)) ``` 2. 创建输入 DStream:使用 StreamingContext 对象创建一个输入 DStream。这个 DStream 可以从多个数据源创建,如 Kafka、Flume、Kinesis、HDFS 等。 ```scala val lines = ssc.socketTextStream("localhost", 9999) ``` 3. 转换操作:通过对输入 DStream 进行一系列转换操作,得到需要的结果。转换操作包括 map、filter、reduceByKey、window 等。 ```scala val words = lines.flatMap(_.split(" ")) val wordCounts = words.map(x => (x, 1)).reduceByKey(_ + _) ``` 4. 输出操作:对转换后的 DStream 进行输出操作,输出结果可以写入 HDFS、Kafka、Cassandra 等存储系统,或者直接打印在控制台。 ```scala wordCounts.print() ``` 5. 启动 StreamingContext:最后需要启动 StreamingContext,并等待程序运行结束。 ```scala ssc.start() ssc.awaitTermination() ``` 完整的 Spark Streaming RDD 编程示例代码如下: ```scala import org.apache.spark.SparkConf import org.apache.spark.streaming.{Seconds, StreamingContext} object SparkStreamingRDD { def main(args: Array[String]): Unit = { val conf = new SparkConf().setAppName("Streaming example") val ssc = new StreamingContext(conf, Seconds(1)) val lines = ssc.socketTextStream("localhost", 9999) val words = lines.flatMap(_.split(" ")) val wordCounts = words.map(x => (x, 1)).reduceByKey(_ + _) wordCounts.print() ssc.start() ssc.awaitTermination() } } ``` 这个例子从本地 9999 端口读取输入数据,将输入数据拆分成单词,并计算每个单词出现的次数。最后将结果打印在控制台。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值