以下是对 SparkSession 对象及其相关内容的整理和补充:
SparkSession 对象概述
在早期的 Spark 版本中,程序执行的入口对象是 sparkContext
,这是 Spark 核心的 API。从 Spark 2.0 版本开始,推出了 SparkSession
对象,成为了 Spark 所有功能的统一入口。无论是 Spark SQL 还是 Spark Core 编程,SparkSession
都是推荐的执行环境入口。
SparkSession 对象的用途
- Spark SQL:
SparkSession
是执行 SQL 查询的入口对象,可以与结构化数据进行交互。 - Spark Core:通过
SparkSession
可以获取SparkContext
,以便继续进行 RDD 操作。 - 统一执行入口:在 Spark 2.0 及以后版本,
SparkSession
取代了之前的SQLContext
和HiveContext
,简化了 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 的区别
- DataFrame 和 Dataset 本质上非常相似,都是用于处理结构化数据的分布式数据集。
- 区别:
- DataFrame:不支持类型安全,更加偏向于 SQL 风格操作,适用于 Python、Java 和 Scala。
- Dataset:支持泛型特性,提供类型安全,更适合 Java 和 Scala 编程语言,使得开发人员能够利用静态类型检查。
总结:
- 从 Spark 2.0 开始,
SparkSession
成为了 Spark 编程(包括 RDD、SQL 等)的统一执行入口,代替了SQLContext
和HiveContext
,使得编程更加一致和方便。 - DataFrame 和 Dataset 是 Spark 进行数据处理的核心抽象,用于简化数据的操作和 SQL 查询。DataFrame 适用于处理表格形式的分布式数据,而 Dataset 则在此基础上引入类型安全,适用于 Scala 和 Java 用户的复杂开发场景。