文章目录
- 1. 实战概述
- 2. RDD(弹性分布式数据集)
- 2.1 RDD概念
- 2.2 RDD特点
- 2.3 实战操作
- 3. DataFrame(数据帧)
- 3.1 DataFrame概念
- 3.2 DataFrame优点
- 3.3 实战操作
- 4. 实战小结
1. 实战概述
- 今天我们将深入探讨 Apache Spark 中的两种核心数据结构:RDD(弹性分布式数据集)和 DataFrame。这两种结构是大数据处理的基石,为分布式计算提供了强大的支持。RDD 提供了对分布式数据集的基本操作,而 DataFrame 则在此基础上增加了对结构化数据的支持,使得数据处理更加高效和易于理解。了解它们的特性、优势以及适用场景,对于在 Spark 上进行高效的大数据处理至关重要。通过实际案例,我们将展示如何利用这些数据结构来解决实际问题。
2. RDD(弹性分布式数据集)
2.1 RDD概念
- RDD,即弹性分布式数据集(Resilient Distributed Dataset),是Apache Spark中最基本的数据结构。它是一个不可变的、分布式的数据集合,由多个分区的数据组成,每个分区可以分布在集群的不同节点上。RDD提供了丰富的操作,包括转换(transformation)和行动(action),来处理数据。它的设计允许系统自动进行容错处理,即在数据丢失时能够自动恢复。RDD的不可变性意味着一旦创建,就不能更改其内容,只能通过转换操作生成新的RDD。这些特性使得RDD非常适合进行大规模并行数据处理。
2.2 RDD特点
- 以数据类型作为参数,例如
RDD[User]
。 - 只知道存储的数据是特定类的实例,但无法感知数据的内部结构,如列名和数据类型。
2.3 实战操作
- 在
net.huawei.sql
包里创建RDDDemo
对象
package net.huawei.sql
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.SparkSession
case class User(name: String, gender: String, age: Long)
object RDDDemo {
def main(args: Array[String]): Unit = {
val spark = SparkSession.builder()
.appName("SparkSQLTest")
.master("local[*]")
.getOrCreate()
import spark.implicits._
val users = Seq(
User("陈燕文", "女", 30),
User("张三丰", "男", 25),
User("李文军", "男", 35),
User("郑智化", "男", 40)
)
val userRDD: RDD[User] = spark.sparkContext.parallelize(users)
val userRDD1: RDD[User] = userRDD.filter(user => user.age > 30)
val userRDD2: RDD[(String, Long)] = userRDD1.map(user => (user.name, user.age))
userRDD2.collect().foreach(println)
}
}
- 运行程序,查看结果
3. DataFrame(数据帧)
3.1 DataFrame概念
- DataFrame 是 Apache Spark 中一种高级的数据结构,以表格形式组织数据,提供了丰富的数据操作功能。与 RDD 相比,DataFrame 能够理解数据的模式,即知道数据存储在哪些列中,以及每列的数据类型。这种结构不仅使得数据操作更加直观和方便,还支持 SQL 查询和多种数据源的读取,极大地简化了数据分析和处理过程。DataFrame 的引入,使得 Spark 在处理结构化数据时更加高效和强大。
3.2 DataFrame优点
- 支持使用 SQL 语句进行数据分析。
- 在大部分数据分析场景下比使用 RDD 更加简洁和方便。
3.3 实战操作
- 在
net.huawei.sql
包里创建DataFrameDemo
对象
package net.huawei.sql
import org.apache.spark.sql.SparkSession
case class User(name: String, gender: String, age: Long)
object DataFrameDemo {
def main(args: Array[String]): Unit = {
val spark = SparkSession.builder()
.appName("SparkSQLTest")
.master("local[*]")
.getOrCreate()
import spark.implicits._
val users = Seq(
User("陈燕文", "女", 30),
User("张三丰", "男", 25),
User("李文军", "男", 35),
User("郑智化", "男", 40)
)
val userDF = users.toDF()
userDF.createOrReplaceTempView("user")
val userDF1 = spark.sql("SELECT name, age FROM user WHERE age > 30")
userDF1.show()
}
}
- 运行程序,查看结果
4. 实战小结
- 通过本次实战,我们掌握了 Apache Spark 中 RDD 和 DataFrame 的基本概念和操作。RDD 提供了对分布式数据集的基本操作,适用于需要自定义分区和转换的场景。DataFrame 则为结构化数据提供了更高效的处理方式,支持 SQL 查询和数据分析。在实际应用中,我们可以根据数据特性和处理需求,灵活选择使用 RDD 或 DataFrame。通过对比,我们发现 DataFrame 在处理表格数据时更为直观和高效,而 RDD 在需要细粒度控制时更为适用。