Spark SQL介绍

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标准连接。因此,它是表达结构化/半结构化数据的最自然的方式。

Spark SQL介绍
滚动到顶部