文章目录
# 前言 本篇主要是对RDD做一个大致的介绍,建立起一个基本的概念
参考文献:pyspark-rdd
1、什么是 RDD - Resilient Distributed Dataset?
RDD(弹性分布式数据集) 是 PySpark 的基本构建块,是spark编程中最基本的数据对象;
它是spark应用中的数据集,包括最初加载的数据集,中间计算的数据集,最终结果的数据集,都是RDD。
从本质上来讲,RDD是对象分布在各个节点上的集合,用来表示spark程序中的数据。以Pyspark为例,其中的RDD就是由分布在各个节点上的python对象组成,类似于python本身的列表的对象的集合。区别在于,python集合仅在一个进程中存在和处理,而RDD分布在各个节点,指的是【分散在多个物理服务器上的多个进程上计算的】
这里多提一句,尽管可以将RDD保存到硬盘上,但RDD主要还是存储在内存中,至少是预期存储在内存中的,因为spark就是为了支持机器学习应运而生。
一旦你创建了一个 RDD,就不能改变它。
2、PySpark RDD 的基本特性和优势
RDD,Resilient Distributed Dataset, 弹性、分布式、数据集,可以从他的名字拆解分析一下:
弹性
: 有弹性,指的是可容错的,即如果一个执行任务的节点丢失了,数据集依然可以被构建出来。这是因为每个RDD都有其谱系(DAG),能够从头构建RDD。分布式
:RDD是分布式的,RDD的数据至少被分到一个分区中,在集群上跨工作节点分布式地作为对象集合保存在内存中;数据集
: RDD是由记录组成的数据集。所谓记录,类似于表中的一“行”数据,一般由几个字段构成。记录,是数据集中唯一可以区分数据的集合,RDD 的各个分区包含不同的一部分记录,可以独立进行操作。
RDD的优势有如下:
- 内存处理
PySpark 从磁盘加载数据并 在内存中处理数据 并将数据保存在内存中,这是 PySpark 和 Mapreduce(I/O 密集型)之间的主要区别。在转换操作过程中,我们还可以在内存中缓存/持久化 RDD 以重用之前的计算。 - 不变性
PySpark 在 HDFS、S3 等上的容错数据存储上运行,因此任何 RDD 操作失败,它会自动从其他分区重新加载数据。此外,当 PySpark 应用程序在集群上运行时,PySpark 任务失败会自动恢复一定次数(根据配置)并无缝完成应用程序。 - 惰性运算
PySpark 不会在驱动程序出现/遇到 RDD 转换时对其进行评估,而是在遇到(DAG)时保留所有转换,并在看到第一个 RDD 操作时评估所有转换。
3、PySpark RDD 局限
PySpark RDD 不太适合更新状态存储的应用程序,例如 Web 应用程序的存储系统。对于这些应用程序,使用执行传统更新日志记录和数据检查点的系统(例如数据库)更有效。
RDD 的目标是为批处理分析提供高效的编程模型,并离开这些异步应用程序。
4、创建 RDD
RDD 主要以两种不同的方式创建:
- 并行化现有的集合;
- 引用在外部存储系统中的数据集(HDFS,S3等等)
在使用pyspark时,一般都会在最开始最开始调用如下入口程序:
from pyspark.sql import SparkSession
# 创建一个spark对象
spark = SparkSession \