RDD的基本概念及创建方式
(一)RDD基本概念
Resilient Distributed Dataset 叫做弹性分布式数据集,是Spark中最基本的数据抽象,是分布式计算的实现载体,代表一个不可变,可分区,里面的元素并行计算的集合。
先来看看这三个单词的含义:
- Dataset: 一个数据集合,用来存放数据的。之前我们学习的Scala中,Array, Set等也叫数据集。
- Distributed: 分布式存储的,表示数据是存放在不同的机器上的。这就和我们前面学习数据结构就不同了。
- Resilient: 数据可以保存在内存或者磁盘中。
然后,我们在看看它的定义中的一些关键字:
不可变的:immutable。类比理解scala中的不可变集合或者是使用val修饰的变量。
可分区的:集合的数据课划分成为很多部分,每部分称为分区:Partition
并行计算:集合中的数据可以被并行的计算处理,每个分区数据被一个Task任务处理。
(二)RDD创建方式
1. 从 Hadoop 支持的文件系统中创建
-
原理:Spark 可以直接从 Hadoop 支持的文件系统(如 HDFS、S3、本地文件系统等)中加载数据创建 RDD。
-
示例代码:
scala复制
val sc = new SparkContext("local", "ReadFileExample") val fileRDD = sc.textFile("hdfs://path/to/your/file.txt")
-
说明:
textFile
方法可以读取文本文件,每行数据作为一个元素存储到 RDD 中。对于其他格式的文件(如 JSON、CSV、Parquet 等),Spark 也提供了相应的读取方法。
2. 从集合中创建
-
原理:通过将内存中的集合数据并行化为 RDD。
-
示例代码:
scala复制
val sc = new SparkContext("local", "ParallelizeExample") val data = Array(1, 2, 3, 4, 5) val parallelizedRDD = sc.parallelize(data, 2) // 第二个参数表示分区数
-
说明:
parallelize
方法将本地集合数据转换为 RDD,并可以指定分区数。分区数决定了数据在集群中的分布情况。
3. 通过其他 RDD 的转换操作创建
-
原理:通过对已有 RDD 进行转换操作(如
map
、filter
、flatMap
等)来生成新的 RDD。 -
示例代码:
scala复制
val sc = new SparkContext("local", "TransformationExample") val fileRDD = sc.textFile("hdfs://path/to/your/file.txt") val wordsRDD = fileRDD.flatMap(line => line.split(" ")) val wordCountRDD = wordsRDD.map(word => (word, 1)).reduceByKey(_ + _)
-
说明:
fileRDD
是从文件中创建的 RDD,通过flatMap
、map
和reduceByKey
等转换操作,生成了新的 RDD(wordsRDD
和wordCountRDD
)。
总结
-
从文件系统中创建:适用于从外部存储加载数据。
-
从集合中创建:适用于将内存中的数据并行化为 RDD。
-
通过转换操作创建:是最常见的创建方式,通过对已有 RDD 进行转换操作生成新的 RDD,支持各种复杂的数据处理逻辑。
这三种方式满足了不同场景下的数据处理需求,是 Spark 编程中非常重要的基础内容。