菜单
本页目录

以下是对 SparkSession 对象及其相关内容的整理和补充:

SparkSession 对象概述

在早期的 Spark 版本中,程序执行的入口对象是 sparkContext,这是 Spark 核心的 API。从 Spark 2.0 版本开始,推出了 SparkSession 对象,成为了 Spark 所有功能的统一入口。无论是 Spark SQL 还是 Spark Core 编程,SparkSession 都是推荐的执行环境入口。

SparkSession 对象的用途

  • Spark SQLSparkSession 是执行 SQL 查询的入口对象,可以与结构化数据进行交互。
  • Spark Core:通过 SparkSession 可以获取 SparkContext,以便继续进行 RDD 操作。
  • 统一执行入口:在 Spark 2.0 及以后版本,SparkSession 取代了之前的 SQLContextHiveContext,简化了 API,使开发更加一致和简洁。

构建 SparkSession 对象

以下是一个创建 SparkSession 对象的代码示例:

请确保spark版本和pyspark一样

from pyspark.sql import SparkSession
import findspark
import os
from pyspark.sql.functions import col

if __name__ == '__main__':
    # 设置 SPARK_HOME 和 JAVA_HOME
    os.environ['SPARK_HOME'] = '/opt/spark'
    os.environ['JAVA_HOME'] = '/usr/lib/jvm/java-8-openjdk-amd64'  # 替换为你的 Java 路径

    # 初始化 findspark
    findspark.init()

    # 创建 Spark 会话
    spark = SparkSession.builder \
        .appName("test") \
        .master("local[*]") \
        .getOrCreate()

    # 获取 Spark 上下文
    sc = spark.sparkContext

    # 读取 HDFS 上的 CSV 文件
    df = spark.read.csv('hdfs://mycluster/sparkdata/student_info_1mb.csv', header=True, inferSchema=True)

    # 打印 Schema
    df.printSchema()

    # 显示数据
    df.show()

    # 将 student_id 转换为整数类型
    df = df.withColumn("student_id", col("student_id").cast("int"))

    # 创建临时视图
    df.createTempView('df_table')

    # 执行 SQL 查询
    result = spark.sql("SELECT * FROM df_table WHERE student_id = 7065")
    result.show()

    # DSL 写法
    result = df.where('student_id = 7065')
    result.show()

SparkSQL 与 Hive 的关系

  • SparkSQL 和 Hive:SparkSQL 和 Hive 都是用于大规模 SQL 分布式计算的框架,均可以运行在 YARN 之上,并在企业中广泛应用。SparkSQL 可以访问 Hive 表的数据,因此可以作为 Hive 的替代或补充来运行 SQL 查询。

数据抽象层次

  • SchemaRDD(已废弃):在早期版本中使用,现已被弃用。
  • DataFrame:类似于 RDD,是分布式数据集,数据以表格形式组织,具有模式(Schema),使得 SQL 操作更方便和高效。
  • Dataset:在 DataFrame 基础上增加了泛型特性,支持类型安全,Java 和 Scala 用户能够在编译时利用这一特性进行类型检查。

DataFrame 与 Dataset 的区别

  • DataFrameDataset 本质上非常相似,都是用于处理结构化数据的分布式数据集。
  • 区别
    • DataFrame:不支持类型安全,更加偏向于 SQL 风格操作,适用于 Python、Java 和 Scala。
    • Dataset:支持泛型特性,提供类型安全,更适合 Java 和 Scala 编程语言,使得开发人员能够利用静态类型检查。

总结

  • 从 Spark 2.0 开始,SparkSession 成为了 Spark 编程(包括 RDD、SQL 等)的统一执行入口,代替了 SQLContextHiveContext,使得编程更加一致和方便。
  • DataFrameDataset 是 Spark 进行数据处理的核心抽象,用于简化数据的操作和 SQL 查询。DataFrame 适用于处理表格形式的分布式数据,而 Dataset 则在此基础上引入类型安全,适用于 Scala 和 Java 用户的复杂开发场景。