RDD和DataFrame两种数据结构的对比

文章目录

  • [1. 实战概述](#1. 实战概述)
  • [2. RDD(弹性分布式数据集)](#2. RDD(弹性分布式数据集))
    • [2.1 RDD概念](#2.1 RDD概念)
    • [2.2 RDD特点](#2.2 RDD特点)
    • [2.3 实战操作](#2.3 实战操作)
  • [3. DataFrame(数据帧)](#3. DataFrame(数据帧))
    • [3.1 DataFrame概念](#3.1 DataFrame概念)
    • [3.2 DataFrame优点](#3.2 DataFrame优点)
    • [3.3 实战操作](#3.3 实战操作)
  • [4. 实战小结](#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对象
scala 复制代码
package net.huawei.sql

import org.apache.spark.rdd.RDD
import org.apache.spark.sql.SparkSession

/**
 * 功能:RDD演示
 * 作者:华卫
 * 日期:2025年01月16日
 */
// 创建用户样例类
case class User(name: String, gender: String, age: Long)

object RDDDemo {
  def main(args: Array[String]): Unit = {
    // 获取或创建Spark会话对象
    val spark = SparkSession.builder()
      .appName("SparkSQLTest")
      .master("local[*]")
      .getOrCreate()

    // 导入隐式转换
    import spark.implicits._

    // 创建用户对象序列
    val users = Seq(
      User("陈燕文", "女", 30),
      User("张三丰", "男", 25),
      User("李文军", "男", 35),
      User("郑智化", "男", 40)
    )

    // 将序列转换为RDD
    val userRDD: RDD[User] = spark.sparkContext.parallelize(users)
    // 过滤年龄大于30的用户
    val userRDD1: RDD[User] = userRDD.filter(user => user.age > 30)
    // 使用map函数提取name和age字段
    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对象
scala 复制代码
package net.huawei.sql

import org.apache.spark.sql.SparkSession

/**
 * 功能:数据帧演示
 * 作者:华卫
 * 日期:2025年01月16日
 */
// 创建用户样例类
case class User(name: String, gender: String, age: Long)

object DataFrameDemo {
  def main(args: Array[String]): Unit = {
    // 获取或创建Spark会话对象
    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")
    // SQL查询:年龄30岁以上,只显示姓名与年龄
    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 在需要细粒度控制时更为适用。
相关推荐
howard200520 小时前
SparkSQL数据模型综合实践
数据模型·dataframe·sparksql
engchina1 个月前
PyCharm 中打印完整的 DataFrame
ide·python·pycharm·dataframe
xiaoping.huang1 个月前
Spark执行计划解析后是如何触发执行的?
大数据·spark·rdd
PersistJiao2 个月前
Spark RDD 的宽依赖和窄依赖
spark·rdd·宽窄依赖
PersistJiao2 个月前
Spark RDD(弹性分布式数据集)的深度理解
大数据·分布式·spark·rdd
PersistJiao2 个月前
Spark RDD Checkpoint 数据的保存机制
spark·checkpoint·rdd
PersistJiao2 个月前
Spark RDD 的 sortBy 和全局排序的理解差异
大数据·分布式·spark·rdd·sortby
PersistJiao2 个月前
Spark RDD 的 combineByKey、cogroup 和 compute 算子的作用
大数据·spark·rdd·底层算子
PersistJiao2 个月前
Spark RDD sortBy算子什么情况会触发shuffle
大数据·spark·rdd·shuffle·sortby