内容
1. 目的
Spark SQL是一个Spark模块,用于简化DataFrame和DataSet抽象的结构化数据的工作,这些抽象是具有命名列的分布式数据集合。使用Spark SQL,我们可以从Spark程序内部查询数据和通过JDBC/ODBC连接到Spark SQL来查询数据。
本章涵盖Spark SQL体系结构的组件,如DataSet和DataFrame,Spark SQL Catalyst优化器。 我们还将了解Spark SQL的优点和缺点。
2. Spark SQL
2.1 Spark SQL简介
Spark SQL是Spark中用于处理结构化/半结构化数据的模块。使用Spark SQL提供的接口,我们可以获得关于数据结构和计算的更多信息,有了这些信息,就可以在Spark中实现额外的优化。我们可以通过各种方式与Spark SQL进行交互,如DataFrame和Dataset API,在计算时使用相同的执行引擎,而不考虑我们使用的语言和API。因此,用户可以轻松地在不同的API之间来回切换,它提供了最自然的方式来使用转换(Transformation)操作。
为了简化对结构化/半结构化数据的处理,它提供了DataFrame抽象,DataFrame是具有命名列的分布式数据集合,它提供了一个很好的优化技术。
在Spark SQL中,我们可以通过三种方式使用结构化和半结构化数据:
1)可以读取和写入各种结构化/半结构化数据,例如JSON、Hive Tables和Parquet。
2)我们可以使用SQL从Spark应用程序内部和使用外部工具查询数据。外部工具通过JDBC/ODBC连接到Spark SQL。
3)使用Spark SQL的最佳方式是在Spark应用程序中,我们能够加载数据并用SQL查询它。 同时,我们还可以将它与别的程序代码(如Spark Core、Spark Streaming)结合使用。
2.2 Spark SQL DataFrame
RDD有一些限制,在处理结构化数据时,没有内置的优化引擎,开发人员需要根据属性来优化每个RDD。Spark SQL中的DataFrame克服了RDD的限制,DataFrame是Spark 1.3发行的,它是一个具有命名列的分布式数据集合。从概念上讲,它等同于关系数据库中的表。我们可以使用以下方法创建DataFrame:
1)结构化的数据文件
2)Hive中的表
3)外部数据库
4)现有的RDD
2.3 Spark SQL Dataset
Spark Dataset是在Spark 1.6版中添加的接口,它是一个分布式数据集合。Dataset提供了RDD的优点以及Spark SQL优化执行引擎的优势。
Dataset可以使用JVM对象创建,然后可以使用转换(map、filter等)进行操作。可以在Scala和Java中访问Dataset API,Python不支持Dataset API。
2.4 Spark Catalyst优化器
Spark SQL使用的优化器是Catalyst优化器,它优化了在Spark SQL和DataFrame DSL中编写的所有查询。优化器帮助我们更快地运行查询,提高了系统的性能。
Spark Catalyst是一个基于规则的库,每条规则都专注于特定的优化,例如ConstantFolding用于消除查询中的常量表达式。
2.5 Spark SQL定义的函数
1)内置函数
提供了内置函数来处理列值,我们可以通过导入以下命令来访问内置函数:
导入org.apache.spark.sql.functions
2)用户定义函数(UDF)
UDF允许用户创建用户定义的函数。
3)聚合函数
这些函数作用在一组行上,并计算每个组的单个返回值。
4)窗口聚合(Windows)
它们对一组行进行操作,并为组中的每一行计算单个返回值。
2.6 Spark SQL的优点
1)集成
Spark SQL将SQL查询与Spark程序混合使用,借助Spark SQL,我们可以查询结构化数据作为分布式数据集(RDD),我们可以使用Spark SQL运行SQL查询以及复杂的分析算法。
2)统一数据访问
使用Spark SQL,我们可以加载和查询来自不同来源的数据。Schema-RDD允许使用单一接口高效地处理结构化数据,例如Apache Hive表、parquet文件和JSON文件。
3)高兼容性
在Spark SQL中,我们可以在现有数据仓库上运行未经修改的Hive查询。Spark SQL完全兼容现有的Hive数据、查询和UDF。
4)标准连接
它可以通过JDBC或ODBC连接。
5)可扩展性
利用了RDD模型,使用相同的引擎进行交互式查询和长时间查询。
6)性能优化
Spark SQL中的查询优化引擎将每个SQL查询转换为逻辑计划,然后转换为许多物理执行计划,最后它选择最优化的物理执行计划。
7)批处理Hive表
利用Spark SQL来快速批量处理Hive表。
2.7 Spark SQL的缺点
1)不支持的union类型
使用Spark SQL,我们不能创建或读取包含联合字段的表。
2)超大型的varchar类型不会发生错误
即使插入的值超过了大小限制,也不会发生错误。如果从Hive读取,则相同的数据将被截断,但如果从Spark读取则不会截断。SparkSQL会将varchar视为一个字符串,这意味着没有大小限制。
3)不支持事务
Spark SQL不支持Hive事务。
4)不支持的char类型
不支持char类型(固定长度字符串)。与union一样,我们无法创建或读取包含此类字段的表。
5)不支持Avro表的时间戳
3. 结论
Spark SQL是分析结构化数据的Spark模块,它提供了可伸缩性,确保了系统的高度兼容性, 具有JDBC/ODBC标准连接。因此,它是表达结构化/半结构化数据的最自然的方式。