文章目录
- day05_Spark SQL课程笔记
- 01_sparkSession和sparkContext区别联系.py
- 02_[掌握]spark_sql词频统计.py
- 03_createDataFrame方式基于列表方式创建df.py
- 04_createDataFrame方式基于RDD创建df.py
- 05_createDataFrame方式基于RDD反射创建df.py
- 06_toDF方式把RDD转换为df.py
- 07_read传统api方式读取text_csv_json.py
- 08_read简写api方式读取text_csv_json.py
- 09_spark_sql词频统计_多种方式.py
day05_Spark SQL课程笔记
一、今日课程内容
- 1- Spark SQL的基本介绍(了解)
- 2- Spark SQL的入门案例(了解)
- 3- DataFrame详解(掌握)
- 4- Spark SQL的综合案例(熟悉)
今日目的:掌握DataFrame详解
二、Spark SQL 基本介绍(了解)
https://spark.apache.org/sql
1、什么是Spark SQL
Spark SQL是Spark多种组件中其中一个,主要是用于处理大规模的**【结构化数据】**
什么是结构化数据: 一份数据, 每一行都有固定的列, 每一列的类型都是一致的 我们将这样的数据称为结构化的数据
例如: mysql的表数据
1 张三 20
2 李四 15
3 王五 18
4 赵六 12
简单来说:Spark SQL是Spark中用于处理结构化数据的模块,就像是“SQL与大数据之间的桥梁”,让用户能够用熟悉的SQL语句查询和分析大规模数据。
具体而言:
- 核心功能:
- DataFrame API:提供类似于Pandas DataFrame的API,支持结构化数据处理。
- SQL查询:用户可以直接使用标准SQL语句查询数据,无需编写复杂的分布式计算代码。
- 数据源集成:支持从多种数据源(如Hive、Parquet、JSON、JDBC)读取数据,并将结果写回到这些数据源。
- 优化引擎:内置Catalyst优化器,能够自动优化查询计划,提升执行效率。
- 应用场景:
- 在数据仓库中,使用Spark SQL查询和分析海量数据,生成报表和洞察。
- 在ETL任务中,使用Spark SQL清洗和转换数据,提升数据处理效率。
- 在实时分析中,结合Structured Streaming,使用Spark SQL处理实时数据流。
实际生产场景:
- 在电商平台中,使用Spark SQL分析用户行为数据,生成个性化推荐。
- 在金融领域,使用Spark SQL处理交易数据,进行风险分析和预测。
总之:Spark SQL结合了SQL的易用性和Spark的分布式计算能力,为结构化数据处理提供了高效、灵活的工具,广泛应用于数据分析和处理任务。
为什么 Spark SQL 是“SQL与大数据之间的桥梁”?
-
连接 SQL 与分布式计算
- SQL:传统SQL用于查询关系型数据库,适合小规模数据处理。
- 大数据:分布式计算框架(如Spark)用于处理海量数据,但需要编写复杂代码。
- Spark SQL:让用户能够用熟悉的SQL语句直接查询大规模数据,无需编写复杂的分布式计算代码,从而在SQL的易用性和大数据的处理能力之间架起桥梁。
-
统一数据访问
- SQL:通常只能访问关系型数据库。
- Spark SQL:支持多种数据源(如Hive、Parquet、JSON、JDBC等),将不同数据源的数据统一为结构化数据,方便用SQL查询。
-
高性能优化
- SQL:传统SQL引擎在处理大数据时性能有限。
- Spark SQL:通过Catalyst优化器和Tungsten引擎,自动优化查询计划,利用分布式计算和内存加速,提升大数据查询性能。
-
降低大数据处理门槛
- SQL:数据分析师和开发者熟悉SQL,但可能不熟悉分布式计算。
- Spark SQL:让这些用户无需学习复杂的分布式编程,直接用SQL处理大数据,降低了大数据处理的门槛。
-
支持复杂场景
- SQL:适合简单的查询和分析。
- Spark SQL:不仅支持标准SQL,还提供DataFrame API,支持复杂的数据处理逻辑(如ETL、机器学习数据准备),并可与Structured Streaming结合,处理实时数据流。
实际意义
Spark SQL通过将SQL的易用性与大数据的分布式计算能力结合,让用户能够轻松处理海量数据,同时保持高性能和灵活性,真正成为“SQL与大数据之间的桥梁”。
为什么要学习Spark SQL呢?
1- 会 SQL的人, 一定比会大数据的人多
2- Spark SQL 既可以编写SQL语句, 也可以编写代码, 甚至可以混合使用
3- Spark SQL 可以 和 HIVE进行集成, 集成后, 可以替换掉HIVE原有MR的执行引擎, 提升效率
简单来说:学习Spark SQL就像是“掌握了一把万能钥匙”,能够轻松处理和分析大规模结构化数据,为数据驱动的业务决策提供强大支持。
具体而言:
- 高效处理大数据:Spark SQL基于Spark引擎,能够分布式处理TB甚至PB级数据,远超传统数据库的性能。
- SQL的易用性:使用标准SQL语句查询数据,降低学习成本,尤其适合熟悉SQL的数据分析师和开发人员。
- 多数据源支持:支持从Hive、Parquet、JSON、JDBC等多种数据源读取数据,满足复杂的数据集成需求。
- 与Spark生态无缝集成:Spark SQL可以与Spark的其他模块(如MLlib、GraphX、Structured Streaming)无缝集成,支持从数据清洗到机器学习、实时分析的完整流程。
- 优化性能:内置Catalyst优化器和Tungsten引擎,能够自动优化查询计划,提升执行效率。
实际生产场景:
- 在数据仓库中,使用Spark SQL快速查询和分析海量数据,生成业务报表。
- 在实时分析中,结合Structured Streaming,使用Spark SQL处理实时数据流,支持实时决策。
- 在机器学习中,使用Spark SQL清洗和准备数据,为模型训练提供高质量的数据输入。
总之:学习Spark SQL能够让你在大数据时代游刃有余,无论是数据分析、实时处理还是机器学习,都能找到用武之地,为职业发展和技术能力提升带来巨大价值。
Spark SQL特点:
1- 融合性: 既可以使用标准SQL语言, 也可以编写代码, 同时支持混合使用
2- 统一的数据访问: 可以通过统一的API来对接不同的数据源
3- HIVE的兼容性: Spark SQL可以和HIVE进行整合, 整合后替换执行引擎为Spark, 核心: 基于HIVE的metastore来处理
4- 标准化连接: Spark SQL也是支持 JDBC/ODBC的连接方式
简单来说:Spark SQL的特点就像是“瑞士军刀”,集成了SQL的易用性、Spark的分布式计算能力和强大的优化引擎,为结构化数据处理提供了高效、灵活的工具。
具体而言:
- 统一的数据访问:支持从多种数据源(如Hive、Parquet、JSON、JDBC)读取数据,并将结果写回到这些数据源。
- SQL与DataFrame API:既支持标准SQL查询,又提供DataFrame API,适合不同开发习惯的用户。
- 高性能优化:内置Catalyst优化器和Tungsten引擎,能够自动优化查询计划,提升执行效率。
- 与Spark生态无缝集成:可以与Spark的其他模块(如MLlib、GraphX、Structured Streaming)无缝集成,支持从数据清洗到机器学习、实时分析的完整流程。
- Hive兼容性:完全兼容Hive,支持HiveQL查询和Hive元数据访问,方便从Hive迁移到Spark SQL。
- 结构化数据处理:专门为结构化数据设计,支持复杂的数据类型(如嵌套结构、数组、Map等)。
- 实时数据处理:结合Structured Streaming,支持实时数据流的SQL查询和分析。
实际生产场景:
- 在数据仓库中,使用Spark SQL快速查询和分析海量数据,生成业务报表。
- 在实时分析中,结合Structured Streaming,使用Spark SQL处理实时数据流,支持实时决策。
- 在机器学习中,使用Spark SQL清洗和准备数据,为模型训练提供高质量的数据输入。
总之:Spark SQL凭借其强大的功能和灵活的接口,成为大数据处理领域的利器,无论是数据分析、实时处理还是机器学习,都能发挥重要作用。
为什么 Spark SQL 像“瑞士军刀”?
-
多功能性
- 瑞士军刀:集多种工具于一身,应对不同任务。
- Spark SQL:集成SQL查询、DataFrame API、流处理等功能,适应多种数据处理场景。
-
灵活性
- 瑞士军刀:工具切换灵活,适应不同需求。
- Spark SQL:支持多种数据源(如Hive、Parquet、JSON等)和开发方式(SQL或API),满足不同开发习惯。
-
高效性
- 瑞士军刀:设计精巧,使用效率高。
- Spark SQL:通过Catalyst优化器和Tungsten引擎,自动优化查询计划,利用列式存储和内存计算加速处理。
-
广泛适用性
- 瑞士军刀:适用于多种场景。
- Spark SQL:覆盖批处理、实时流处理、机器学习等,适用于数据仓库、实时分析、数据湖等多种场景。
-
易用性
- 瑞士军刀:操作简单,易于使用。
- Spark SQL:兼容Hive,支持标准SQL,降低大数据处理门槛。
SparkSQL发展历史:
● 2014年 1.0正式发布
● 2015年 1.3 发布DataFrame数据结构, 沿用至今
● 2016年 1.6 发布Dataset数据结构(带泛型的DataFrame), 适用于支持泛型的语言(Java\Scala)
● 2016年 2.0 统一了Dataset 和 DataFrame, 以后只有Dataset了, Python用的DataFrame就是 没有泛型的Dataset
注意: 2019年 3.0 发布, 性能大幅度提升,SparkSQL变化不大
2、Spark SQL 与 HIVE异同
相同点:
1- 都是分布式SQL计算引擎
2- 都可以处理大规模的结构化数据
3- 都可以建立Yarn集群之上运行
不同点:
1- Spark SQL是基于内存计算, 而HIVE SQL是基于磁盘进行计算的
2- Spark SQL没有元数据管理服务(自己维护), 而HIVE SQL是有metastore的元数据管理服务的
3- Spark SQL底层执行Spark RDD程序, 而HIVE SQL底层执行是MapReduce
4- Spark SQL可以编写SQL也可以编写代码,但是HIVE SQL仅能编写SQL语句
简单来说:Spark SQL和Hive都是用于处理大规模结构化数据的工具,但Spark SQL更像是“高性能跑车”,而Hive则是“可靠的卡车”,两者各有优劣,适合不同的场景。
具体而言:
- 相同点:
- SQL支持:两者都支持标准SQL查询,降低了使用门槛。
- 大数据处理:都适用于处理大规模结构化数据,支持TB甚至PB级数据。
- Hive兼容性:Spark SQL完全兼容Hive,支持HiveQL查询和Hive元数据访问。
- 不同点:
- 执行引擎:
- Spark SQL基于Spark引擎,采用内存计算,适合迭代计算和实时处理。
- Hive基于MapReduce引擎,采用磁盘计算,适合离线批处理。
- 性能:
- Spark SQL的性能通常优于Hive,尤其是在复杂查询和迭代计算场景中。
- Hive在处理超大规模数据时稳定性更高,但速度较慢。
- 实时性:
- Spark SQL支持实时数据处理(通过Structured Streaming)。
- Hive主要用于离线批处理,实时性较差。
- 易用性:
- Spark SQL提供DataFrame API,支持多种编程语言(如Python、Scala、Java),开发更灵活。
- Hive主要依赖SQL,扩展性较弱。
实际生产场景:
- 在需要快速迭代和实时分析的场景中,如用户行为分析,Spark SQL更为适合。
- 在超大规模离线批处理场景中,如历史数据归档,Hive更为稳定可靠。
总之:Spark SQL和Hive各有优势,选择时需根据业务需求、数据规模和性能要求综合考虑。两者也可以结合使用,发挥各自的优势。
3、Spark SQL的数据结构对比
说明:
pandas的DataFrame: 二维表 处理单机结构数据
SparkCore的RDD: 处理任何的数据结构 处理大规模的分布式数据
SparkSQL的DataFrame: 二维表 处理大规模的分布式结构数据
RDD(Resilient Distributed Dataset)是Spark中最基本的抽象,代表了一个不可变、分布式的数据集合。RDD支持并行操作,可以在集群中的多个节点上进行处理。RDD具有容错性,即使在节点故障时也能够自动恢复。但是RDD只提供了基本的功能,对于结构化数据的处理能力有限。
DataFrame是Spark SQL中的一个概念,它是一种以列为主的分布式数据集合,类似于关系型数据库中的表格。DataFrame具有数据结构化的特点,每一列都有相应的数据类型,而且可以使用SQL语句进行查询和操作。DataFrame也支持大部分RDD的操作,但是在处理结构化数据方面更加方便。
DataSet是Spark 2.0引入的一种新的API,它是DataFrame的一个扩展,提供了类型安全的数据操作。DataSet在编译时检查数据类型,可以避免一些运行时的错误。与DataFrame相比,DataSet更加适用于需要强类型支持的场景,但是在灵活性和易用性方面可能略逊于DataFrame。
由于Python不支持泛型, 所以无法使用Dataset类型, 客户端仅支持DataFrame类型
三、Spark SQL的入门案例(掌握)
SparkSession 和 SparkContext 是 Apache Spark 中两个重要的组件,它们在 Spark 应用程序中扮演着不同的角色。
SparkContext:
SparkContext 是 Spark 1.x 版本中最重要的入口点,在 Spark 2.x 版本中,它已经被 SparkSession 取代,但在一些旧的代码和文档中仍然可能会看到它的存在。
SparkContext 是 Spark 应用程序与 Spark 集群通信的主要入口点。它负责与集群管理器(如 YARN、Mesos 或 Spark 自带的 Standalone)通信,以便分配资源和执行任务。
SparkContext 提供了创建 RDD(弹性分布式数据集)的功能,RDD 是 Spark 中基本的数据抽象,代表了分布在集群中的不可变的数据集。
SparkSession:
在 Spark 2.x 中,SparkSession 被引入来取代 SparkContext,并提供了更多功能和简化的 API。,它是 Spark 应用程序中的入口点,封装了 SparkContext。
SparkSession 提供了一种统一的入口点,用于读取数据、执行查询、进行数据处理等各种 Spark 任务。
SparkSession 提供了 DataFrame 和 Dataset API,这两种 API 提供了更高级别、更易于使用的抽象,用于处理结构化数据。
与 SparkContext 不同,SparkSession 可以与 Hive 集成,允许在 Spark 应用程序中执行 SQL 查询,并访问 Hive 中的表和数据。
总之,SparkContext 是 Spark 1.x 版本中的主要入口点,负责与集群通信和管理资源,而 SparkSession 是 Spark 2.x 中的主要入口点,提供了更多的功能和简化的 API,用于执行各种 Spark 任务,并且可以与 Hive 集成。还可以通过SparkSession对象还是可以得到SparkContext对象。
入门体验
# 导包
import os
from pyspark.sql import SparkSession
# 绑定指定的python解释器
os.environ['SPARK_HOME'] = '/export/server/spark'
os.environ['PYSPARK_PYTHON'] = '/root/anaconda3/bin/python3'
os.environ['PYSPARK_DRIVER_PYTHON'] = '/root/anaconda3/bin/python3'
# 创建main函数
if __name__ == '__main__':
# 1.创建SparkContext对象
spark = SparkSession.builder.appName('pyspark_demo').master('local[*]').getOrCreate()
sc = spark.sparkContext
# print(spark,type(spark))
# print(sc,type(sc))
# 2.验证是否能生成rdd
textRDD = sc.textFile('file:///export/data/spark_project/spark_sql/data/uniqlo.csv')
# collect: 搜集数据触发任务展示数据 count:获取数据条数 type:查看类型
# print(textRDD.collect())
print(textRDD.count())
print(type(textRDD)) # <class 'pyspark.rdd.RDD'>
# 验证是否能生成DataFrame
df = spark.read.csv('file:///export/data/spark_project/spark_sql/data/uniqlo.csv')
# show: 展示数据 count:获取数据条数 type:查看类型
# print(df.show())
print(df.count())
print(type(df)) # <class 'pyspark.sql.dataframe.DataFrame'>
# 3.关闭资源
sc.stop()
spark.stop()
四、DataFrame详解(熟悉)
1.DataFrame基本介绍
DataFrame表示的是一个二维的表。二维表,必然存在行、列等表结构描述信息
表结构描述信息(元数据Schema): StructType对象
字段: StructField对象,可以描述字段名称、字段数据类型、是否可以为空
行: Row对象
列: Column对象,包含字段名称和字段值
在一个StructType对象下,由多个StructField组成,构建成一个完整的元数据信息
如何构建表结构信息数据:
2.DataFrame的构建方式
方式1: 使用SparkSession的createDataFrame(data,schema)函数创建
data参数
1.基于List列表数据进行创建
2.基于RDD弹性分布式数据集进行创建
3.基于pandas的DataFrame数据进行创建
schema参数
1: 字符串
格式一 :“字段名1 字段类型,字段名2 字段类型”
格式二(推荐):“字段名1:字段类型,字段名2:字段类型”
2: List
格式: ["字段名1","字段名2"]
3: DataType(推荐,用的最多)
格式一:schema=StructType().add('字段名1',字段类型).add('字段名2',字段类型)
格式二:schema=StructType([StructField('字段名1',类型),StructField('字段名1',类型)])
方式2: 使用DataFrame的toDF(colNames)函数创建
DataFrame的toDF方法是一个在Apache Spark的DataFrame API中用来创建一个新的DataFrame的方法。这个方法可以将一个RDD转换为DataFrame,或者将一个已存在的DataFrame转换为另一个DataFrame。在Python中,你可以使用toDF方法来指定列的名字。如果你不指定列的名字,那么默认的列的名字会是_1, _2等等。
格式: rdd.toDF([列名])
方式3: 使用SparkSession的read()函数创建
在 Spark 中,SparkSession 的 read 是用于读取数据的入口点之一,它提供了各种方法来读取不同格式的数据并将其加载到 Spark 中进行处理。
统一API格式:
spark.read
.format('text|csv|json|parquet|orc|...') : 读取外部文件的方式
.option('k','v') : 选项 可以设置相关的参数 (可选)
.schema(StructType | String) : 设置表的结构信息
.load('加载数据路径') : 读取外部文件的路径, 支持 HDFS 也支持本地
简写API格式:
注意: 以上所有的外部读取方式,都有简单的写法。spark内置了一些常用的读取方案的简写
格式: spark.read.文件读取方式('加载数据路径')
注意: parquet:是Spark中常用的一种列式存储文件格式和Hive中的ORC差不多, 他俩都是列存储格式
2.1 createDataFrame()创建
场景:一般用在开发和测试中。因为只能处理少量的数据
2.1.1 基于列表
# 导包
import os
from pyspark.sql import SparkSession
# 绑定指定的python解释器
os.environ['SPARK_HOME'] = '/export/server/spark'
os.environ['PYSPARK_PYTHON'] = '/root/anaconda3/bin/python3'
os.environ['PYSPARK_DRIVER_PYTHON'] = '/root/anaconda3/bin/python3'
# 创建main函数
if __name__ == '__main__':
# 1.创建SparkContext对象
spark = SparkSession.builder.appName('pyspark_demo').master('local[*]').getOrCreate()
# 2.创建DF对象
data = [(1, '张三', 18)