第1章 SparkSQL 概述

1.1 SparkSQL 是什么

在这里插入图片描述
Spark SQL 是 Spark 用于结构化数据(structured data)处理的 Spark 模块。

SparkSQL是Apache Spark中的一个模块,用于处理结构化数据。它提供了一个用于处理关系型数据的高级接口,并允许在Spark中执行SQL查询、操作DataFrame和DataSet等数据结构。

SparkSQL的主要功能包括:

  1. DataFrame和DataSet:SparkSQL引入了DataFrame和DataSet这两种数据结构,它们是以RDD为基础构建的,提供了更高级的API操作结构化数据。DataFrame是分布式数据集,类似于关系型数据库中的表,而DataSet是类型化的DataFrame,支持更丰富的类型操作。

  2. SQL查询:SparkSQL允许通过标准的SQL查询语言来操作DataFrame和DataSet。用户可以使用SQL查询语句进行数据过滤、投影、聚合等操作。

  3. 分布式计算:SparkSQL是构建在Spark的分布式计算引擎之上的,可以处理大规模数据集,并利用集群的并行处理能力进行高效的数据处理。

  4. 内存计算:SparkSQL利用Spark的内存计算特性,将部分数据加载到内存中进行计算,减少磁盘IO,提高计算效率。

  5. Catalyst优化器:SparkSQL引入了Catalyst优化器,它是一个可扩展的查询优化框架,用于优化查询计划。Catalyst优化器可以通过一系列的优化规则和转换来优化查询性能。

  6. Hive兼容性:SparkSQL兼容Hive,可以直接运行Hive的查询。通过Hive兼容性,用户可以在不迁移数据的情况下将现有的Hive查询迁移到Spark中运行。

  7. 数据源集成:SparkSQL支持连接多种数据源,包括Hive、JSON、Parquet、Avro等,以及其他外部数据源。这使得SparkSQL能够与不同类型的数据进行交互。

  8. 用户自定义函数(UDF):SparkSQL允许用户定义自己的UDF,以便进行自定义的数据处理和计算操作。

  9. 惰性执行:SparkSQL采用了惰性执行的策略,也就是说,它不会立即执行查询操作,而是等到需要得到最终结果时才进行实际计算,这样可以优化查询计划,提高计算性能。

总的来说,SparkSQL提供了一个功能强大的数据处理和查询引擎,结合了SQL查询、DataFrame和DataSet等数据结构,并充分利用Spark的分布式计算能力,适用于大规模数据处理和复杂查询任务。它是Apache Spark中重要的组成部分,为用户提供了更加高效和灵活的数据分析和查询功能。

1.2 Hive and SparkSQL

SparkSQL 的前身是 Shark,给熟悉 RDBMS 但又不理解 MapReduce 的技术人员提供快速上手的工具。

Hive 是早期唯一运行在 Hadoop 上的 SQL-on-Hadoop 工具。但是 MapReduce 计算过程中大量的中间磁盘落地过程消耗了大量的 I/O,降低的运行效率,为了提高 SQL-on-Hadoop的效率,大量的 SQL-on-Hadoop 工具开始产生,其中表现较为突出的是:
⚫ Drill

Apache Drill是一个开源的分布式SQL查询引擎,它允许用户在大规模数据集上执行SQL查询,无论数据是结构化的还是半结构化的。Drill旨在提供一个高性能、低延迟的查询引擎,可以直接查询多种数据源,包括Hadoop分布式文件系统(HDFS)、NoSQL数据库、关系型数据库、云存储等。

以下是Apache Drill的主要特点和功能:

  1. 分布式查询:Drill是构建在Apache Drill的分布式计算引擎之上的,可以运行在多台机器上,利用集群的并行处理能力来执行大规模的数据查询任务。

  2. SQL兼容性:Drill支持标准的SQL查询语言,用户可以使用标准的SQL语法来查询数据,这使得使用Drill非常方便和灵活。

  3. 查询多种数据源:Drill可以直接查询多种数据源,无需预定义模式或元数据,支持查询Hadoop的HDFS、NoSQL数据库(如MongoDB、HBase等)、关系型数据库(如MySQL、PostgreSQL等)、云存储(如Amazon S3、Azure Blob Storage等)等。

  4. 半结构化数据支持:Drill可以查询半结构化数据,如JSON、Parquet、Avro等格式,这使得处理复杂的数据变得更加容易。

  5. 高性能:Drill采用了分布式执行和列式存储的技术,以及查询优化器来提高查询性能和执行效率。

  6. 智能优化:Drill利用智能优化器来选择合适的执行计划,以提高查询的性能和吞吐量。

  7. 动态模式发现:Drill可以在查询时动态发现数据的模式,无需预先定义模式或元数据,这使得查询非结构化或变化频繁的数据变得更加方便。

  8. 容错性:Drill具有容错性,支持失败恢复和故障转移,保证查询的可靠性。

总的来说,Apache Drill是一个强大的分布式SQL查询引擎,具有高性能、低延迟、查询多种数据源等特点,使得在大规模数据集上进行SQL查询变得更加方便和高效。它是一个非常有价值的工具,特别适用于需要在多种数据源中进行复杂查询和分析的场景。

⚫ Impala

Impala是由Cloudera开发的开源分布式SQL查询引擎,旨在实现高性能、低延迟的SQL查询,可以直接查询Hadoop分布式文件系统(HDFS)和HBase等存储系统中的数据。Impala是基于Google的Dremel论文所提出的技术概念,它允许用户通过标准的SQL语句来查询和分析大规模数据集,而无需将数据转换为其他格式或进行复杂的数据迁移。

以下是Impala的主要特点和功能:

  1. 分布式查询:Impala是构建在Hadoop分布式计算平台之上的,它能够在大规模数据集上并行执行查询任务,利用集群的计算资源来提高查询性能。

  2. SQL兼容性:Impala支持标准的SQL查询语言,用户可以使用熟悉的SQL语法来查询和分析数据,从而降低了学习成本。

  3. 高性能:Impala采用了MPP(Massively Parallel Processing)架构,利用并行计算和内存计算技术来提高查询性能和响应速度。对于大规模数据集的复杂查询,Impala能够实现低延迟的查询结果。

  4. 与Hive兼容:Impala兼容Hive的元数据和表定义,可以与Hive和Hue等工具无缝集成,从而简化了数据处理和查询流程。

  5. 支持复杂数据类型:Impala支持复杂的数据类型,如数组、结构体、嵌套的数据等,使得对半结构化数据的查询变得更加灵活和方便。

  6. 支持多种文件格式:Impala支持多种数据文件格式,包括Parquet、Avro、ORC等,从而能够直接查询这些文件格式中的数据,无需进行额外的数据转换。

  7. 容错性:Impala具有容错性,支持故障转移和自动恢复,确保查询任务的可靠性。

总的来说,Impala是一个高性能、低延迟的分布式SQL查询引擎,适用于对大规模数据集进行复杂查询和分析的场景。它与Hadoop生态系统紧密集成,可以直接查询HDFS和HBase等存储系统中的数据,为用户提供了一个强大且方便的数据处理和查询工具。

⚫ Shark

Shark是一个由UC Berkeley AMP Lab开发的开源项目,它是在Apache Spark之上构建的分布式数据仓库系统。Shark的目标是提供一个高性能、低延迟的数据仓库系统,能够执行复杂的SQL查询和数据分析任务,并与Hive兼容。

Shark的主要特点和功能包括:

  1. 分布式SQL查询:Shark支持通过标准的SQL查询语言来执行数据查询和分析任务。它允许用户使用SQL语句对大规模数据集进行查询、过滤、聚合等操作。

  2. 基于Spark:Shark是构建在Apache Spark之上的,利用了Spark的内存计算和分布式计算能力,可以在大规模数据集上执行高性能的查询。

  3. 支持Hive:Shark兼容Hive的元数据和表定义,可以与Hive生态系统无缝集成,使得用户可以在Shark中运行现有的Hive查询。

  4. 高性能:Shark采用了列式存储和查询优化器,通过优化查询计划和并行执行,实现了高性能和低延迟的数据查询。

  5. 多种数据格式支持:Shark支持多种数据文件格式,包括Parquet、Avro、ORC等,可以直接查询这些格式中的数据。

  6. 用户自定义函数(UDF):Shark允许用户定义自己的UDF,以便进行自定义的数据处理和计算操作。

  7. 容错性:Shark具有容错性,支持故障转移和自动恢复,保证查询任务的可靠性。

需要注意的是,Shark在较早的版本中是基于Hive的一个改进版本,后来随着Spark SQL的出现,Spark SQL逐渐取代了Shark。目前,Spark SQL已经成为Apache Spark的正式组件,并且提供了更加丰富和强大的功能,因此建议使用Spark SQL来代替Shark进行数据仓库和SQL查询的任务。

其中 Shark 是伯克利实验室 Spark 生态环境的组件之一,是基于 Hive 所开发的工具,它修改了下图所示的右下角的内存管理、物理计划、执行三个模块,并使之能运行在 Spark 引擎上。
在这里插入图片描述
Shark 的出现,使得 SQL-on-Hadoop 的性能比 Hive 有了 10-100 倍的提高。

在这里插入图片描述

  • 但是,随着 Spark 的发展,对于野心勃勃的 Spark 团队来说,Shark 对于 Hive 的太多依赖(如采用 Hive 的语法解析器、查询优化器等等),制约了 Spark 的 One Stack Rule Them All的既定方针,制约了 Spark 各个组件的相互集成,所以提出了 SparkSQL 项目。
  • SparkSQL抛弃原有 Shark 的代码,汲取了 Shark 的一些优点,如内存列存储(In-Memory Columnar Storage)、Hive兼容性等,重新开发了SparkSQL代码;由于摆脱了对Hive的依赖性,SparkSQL无论在数据兼容、性能优化、组件扩展方面都得到了极大的方便,真可谓“退一步,海阔天空”。

➢ 数据兼容方面 SparkSQL 不但兼容 Hive,还可以从 RDD、parquet 文件、JSON 文件中获取数据,未来版本甚至支持获取 RDBMS 数据以及 cassandra 等 NOSQL 数据;

➢ 性能优化方面 除了采取 In-Memory Columnar Storage、byte-code generation 等优化技术外、将会引进 Cost Model 对查询进行动态评估、获取最佳物理计划等等;

➢ 组件扩展方面 无论是 SQL 的语法解析器、分析器还是优化器都可以重新定义,进行扩展。
在这里插入图片描述
2014 年 6 月 1 日 Shark 项目和 SparkSQL 项目的主持人 Reynold Xin 宣布:停止对 Shark 的开发,团队将所有资源放 SparkSQL 项目上,至此,Shark 的发展画上了句话,但也因此发展出两个支线:SparkSQL 和 Hive on Spark。

在这里插入图片描述

Spark SQL

Spark SQL是Apache Spark中的一个模块,用于处理结构化数据。它提供了一个用于处理关系型数据的高级接口,并允许在Spark中执行SQL查询、操作DataFrame和DataSet等数据结构。

Spark SQL的主要功能包括:

  1. DataFrame和DataSet:Spark SQL引入了DataFrame和DataSet两种数据结构,它们是以RDD为基础构建的,提供了更高级的API操作结构化数据。DataFrame是分布式数据集,类似于关系型数据库中的表,而DataSet是类型化的DataFrame,支持更丰富的类型操作。

  2. SQL查询:Spark SQL允许通过标准的SQL查询语言来操作DataFrame和DataSet。用户可以使用SQL查询语句进行数据过滤、投影、聚合等操作。

  3. 数据源集成:Spark SQL支持连接多种数据源,包括Hive、JSON、Parquet、Avro等,以及其他外部数据源。这使得Spark SQL能够与不同类型的数据进行交互。

  4. Catalyst优化器:Spark SQL引入了Catalyst优化器,它是一个可扩展的查询优化框架,用于优化查询计划。Catalyst优化器可以通过一系列的优化规则和转换来优化查询性能。

  5. Hive兼容性:Spark SQL兼容Hive,可以直接运行Hive的查询。通过Hive兼容性,用户可以在不迁移数据的情况下将现有的Hive查询迁移到Spark中运行。

  6. 用户自定义函数(UDF):Spark SQL允许用户定义自己的UDF,以便进行自定义的数据处理和计算操作。

Spark SQL提供了更高级的API和查询语言,使得在Spark上处理结构化数据更加方便和灵活。它与Spark的其他模块(如Spark Core和Spark Streaming)紧密集成,可以与它们无缝地协作,为分布式数据处理和分析提供了强大的功能。

Hive on Spark

Hive on Spark是将Hive与Apache Spark结合使用的一种方式,它是Hive和Spark的集成,旨在将Hive的数据仓库功能和Spark的分布式计算能力相结合,从而在大规模数据处理和查询中提供更好的性能和灵活性。

在Hive on Spark中,Hive作为数据仓库系统用于管理和查询结构化数据,而Spark用于执行实际的计算任务。Hive on Spark的主要目标是加速Hive查询,提高查询性能和扩展性,并支持更复杂的数据分析操作。

Hive on Spark的特点和优势包括:

  1. 加速查询性能:通过使用Spark的分布式计算引擎,Hive on Spark可以在大规模数据集上加速查询的执行。Spark的内存计算和数据并行处理能力可以显著提高查询性能。

  2. 内存计算:Hive on Spark可以利用Spark的内存计算特性,将部分数据加载到内存中进行计算,减少磁盘IO,进而提高计算效率。

  3. 动态分区和动态分桶:Hive on Spark支持动态分区和动态分桶,可以根据数据的特点和查询需求自动优化数据的存储和查询方式。

  4. Hive UDF和UDAF支持:Hive on Spark支持Hive的用户自定义函数(UDF)和用户自定义聚合函数(UDAF),用户可以在Spark上运行自己定义的复杂计算逻辑。

  5. 资源管理:Hive on Spark可以利用Spark的资源管理器来管理执行任务的资源,确保作业的公平性和高效性。

  6. Hive和Spark的无缝集成:Hive on Spark与Hive的原生语法和功能无缝集成,用户可以继续使用熟悉的Hive语法和API,而无需修改现有的查询和脚本。

需要注意的是,Hive on Spark并不是Hive的替代品,而是Hive的一个加强版。用户可以根据具体的场景和需求选择使用Hive on Spark还是原生Hive。对于大规模数据处理和复杂查询任务,特别是需要利用Spark的分布式计算能力时,Hive on Spark是一个非常有价值的选择。

  • 其中 SparkSQL 作为 Spark 生态的一员继续发展,而不再受限于 Hive,只是兼容 Hive;而Hive on Spark 是一个 Hive 的发展计划,该计划将 Spark 作为 Hive 的底层引擎之一,也就是说,Hive 将不再受限于一个引擎,可以采用 Map-Reduce、Tez、Spark 等引擎。
  • 对于开发人员来讲,SparkSQL 可以简化 RDD 的开发,提高开发效率,且执行效率非常快,所以实际工作中,基本上采用的就是 SparkSQL。Spark SQL 为了简化 RDD 的开发,提高开发效率,提供了 2 个编程抽象,类似 Spark Core 中的 RDD。

➢ DataFrame

DataFrame是Spark SQL中的一个核心概念,是一个分布式的数据集合,类似于关系型数据库中的表格或Pandas中的DataFrame。它是由行和列组成的二维数据结构,支持结构化数据的处理和查询。

DataFrame的特点和优势包括:

  1. 分布式计算:DataFrame是构建在Spark的分布式计算引擎之上的,它能够处理大规模数据集,并利用集群的并行处理能力进行高效的数据处理。

  2. 结构化数据:DataFrame是一种结构化数据集,每一列都有特定的数据类型,类似于关系型数据库中的表格。这使得DataFrame能够更好地适应结构化数据的处理需求。

  3. 延迟执行:Spark的DataFrame采用了惰性执行的策略,也就是说,它不会立即执行查询操作,而是等到需要得到最终结果时才进行实际计算,这样可以优化查询计划,提高计算性能。

  4. API丰富:Spark提供了丰富的DataFrame API,支持多种数据操作和转换,包括过滤、映射、聚合、连接等,以及SQL查询操作,使得数据处理更加方便和灵活。

  5. 数据源支持:DataFrame支持多种数据源,包括Hive、JSON、Parquet、Avro等,以及其他外部数据源,这样可以方便地与不同类型的数据进行交互。

  6. 用户自定义函数(UDF):DataFrame允许用户定义自己的UDF,以便进行自定义的数据处理和计算操作。

  7. 可优化性:通过使用Catalyst优化器,DataFrame可以在执行查询之前进行优化,优化查询计划,提高性能。

使用DataFrame,可以更方便地处理和分析结构化数据,它是Spark SQL中进行高级数据操作的核心工具。同时,由于DataFrame是构建在Spark分布式计算引擎之上的,因此也能够处理大规模数据,并充分利用集群的计算资源,提供高性能的数据处理能力。

➢ DataSet

DataSet是Spark SQL中的一个数据集合,是DataFrame的类型化版本。DataSet是在Spark 1.6版本中引入的,它结合了DataFrame的结构化数据处理能力和RDD的强类型特性,提供了更加强大和类型安全的数据操作。

DataSet的特点和优势包括:

  1. 强类型:DataSet是类型化的,它允许用户在编译时就指定数据类型,从而在编译时就能发现类型错误,提高了代码的健壮性和可维护性。相比之下,DataFrame是无类型的,只有在运行时才能发现类型错误。

  2. 类型安全:由于DataSet是类型化的,它可以在编译时捕获类型错误,避免了运行时类型转换错误,减少了bug的可能性。

  3. API一致性:DataSet的API与DataFrame的API是一致的,大部分DataFrame的操作在DataSet中都可以使用。这使得从DataFrame迁移到DataSet变得更加容易。

  4. 查询优化:与DataFrame一样,DataSet也支持Catalyst优化器,可以优化查询计划,提高查询性能。

  5. 分布式计算:DataSet是构建在Spark的分布式计算引擎之上的,可以处理大规模数据集,并利用集群的并行处理能力进行高效的数据处理。

  6. 数据源支持:DataSet支持多种数据源,包括Hive、JSON、Parquet、Avro等,以及其他外部数据源,这样可以方便地与不同类型的数据进行交互。

  7. 用户自定义函数(UDF):DataSet允许用户定义自己的UDF,以便进行自定义的数据处理和计算操作。

  8. 数据序列化:DataSet的数据在内存中以二进制格式进行序列化,从而减少了内存占用,提高了内存使用效率。

总的来说,DataSet是Spark SQL中更加强大和类型安全的数据结构,适用于那些需要更严格类型检查的应用场景。对于需要更加灵活和动态的数据处理,以及与其他非结构化数据源进行交互的场景,DataFrame可能更适合。

1.3 SparkSQL 特点

Spark SQL是Apache Spark中用于处理结构化数据的模块,它提供了一个用于处理关系型数据的高级接口,并允许在Spark中执行SQL查询、操作DataFrame和DataSet等数据结构。以下是Spark SQL的主要特点:

  1. 结构化数据处理:Spark SQL支持结构化数据的处理,可以通过DataFrame和DataSet这两种数据结构来处理和查询数据。这使得在Spark上处理结构化数据更加方便和灵活。

  2. SQL查询:Spark SQL允许通过标准的SQL查询语言来操作DataFrame和DataSet。用户可以使用SQL查询语句进行数据过滤、投影、聚合等操作,从而更加方便地进行数据分析和查询。

  3. 分布式计算:Spark SQL是构建在Spark的分布式计算引擎之上的,可以处理大规模数据集,并利用集群的并行处理能力进行高效的数据处理。

  4. 内存计算:Spark SQL利用Spark的内存计算特性,将部分数据加载到内存中进行计算,减少磁盘IO,进而提高计算效率。

  5. Catalyst优化器:Spark SQL引入了Catalyst优化器,它是一个可扩展的查询优化框架,用于优化查询计划。Catalyst优化器可以通过一系列的优化规则和转换来优化查询性能。

  6. Hive兼容性:Spark SQL兼容Hive,可以直接运行Hive的查询。通过Hive兼容性,用户可以在不迁移数据的情况下将现有的Hive查询迁移到Spark中运行。

  7. 数据源集成:Spark SQL支持连接多种数据源,包括Hive、JSON、Parquet、Avro等,以及其他外部数据源。这使得Spark SQL能够与不同类型的数据进行交互。

  8. 用户自定义函数(UDF):Spark SQL允许用户定义自己的UDF,以便进行自定义的数据处理和计算操作。

  9. 惰性执行:Spark SQL采用了惰性执行的策略,也就是说,它不会立即执行查询操作,而是等到需要得到最终结果时才进行实际计算,这样可以优化查询计划,提高计算性能。

总的来说,Spark SQL提供了一个功能强大的数据处理和查询引擎,结合了SQL查询、DataFrame和DataSet等数据结构,并充分利用Spark的分布式计算能力,适用于大规模数据处理和复杂查询任务。它是Apache Spark中重要的组成部分,为用户提供了更加高效和灵活的数据分析和查询功能。

1.3.1 易整合

无缝的整合了 SQL 查询和 Spark 编程
在这里插入图片描述

1.3.2 统一的数据访问

使用相同的方式连接不同的数据源
在这里插入图片描述

1.3.3 兼容 Hive

在已有的仓库上直接运行 SQL 或者 HiveQL
在这里插入图片描述

1.3.4 标准数据连接

通过 JDBC 或者 ODBC 来连接
在这里插入图片描述

1.4 DataFrame 是什么

  • 在 Spark 中,DataFrame 是一种以 RDD 为基础的分布式数据集,类似于传统数据库中的二维表格。DataFrame 与 RDD 的主要区别在于,前者带有 schema 元信息,即 DataFrame所表示的二维表数据集的每一列都带有名称和类型。这使得 Spark SQL 得以洞察更多的结构信息,从而对藏于 DataFrame 背后的数据源以及作用于 DataFrame 之上的变换进行了针对性的优化,最终达到大幅提升运行时效率的目标。反观 RDD,由于无从得知所存数据元素的具体内部结构,Spark Core 只能在 stage 层面进行简单、通用的流水线优化。

  • 同时,与 Hive 类似,DataFrame 也支持嵌套数据类型(struct、array 和 map)。从 API 易用性的角度上看,DataFrame API 提供的是一套高层的关系操作,比函数式的 RDD API 要更加友好,门槛更低。

在这里插入图片描述
上图直观地体现了 DataFrame 和 RDD 的区别。

  • 左侧的 RDD[Person]虽然以 Person 为类型参数,但 Spark 框架本身不了解 Person 类的内部结构。而右侧的 DataFrame 却提供了详细的结构信息,使得 Spark SQL 可以清楚地知道该数据集中包含哪些列,每列的名称和类型各是什么。DataFrame 是为数据提供了 Schema 的视图。可以把它当做数据库中的一张表来对待DataFrame 也是懒执行的,但性能上比 RDD 要高,
  • 主要原因:优化的执行计划,即查询计划通过 Spark catalyst optimiser 进行优化。比如下面一个例子:
    在这里插入图片描述
  • 为了说明查询优化,我们来看上图展示的人口数据分析的示例。图中构造了两个DataFrame,将它们 join 之后又做了一次 filter 操作。如果原封不动地执行这个执行计划,最终的执行效率是不高的。因为 join 是一个代价较大的操作,也可能会产生一个较大的数据集。如果我们能将 filter 下推到 join 下方,先对 DataFrame 进行过滤,再 join 过滤后的较小的结果集,便可以有效缩短执行时间。而 Spark SQL 的查询优化器正是这样做的。简而言之,逻辑查询计划优化就是一个利用基于关系代数的等价变换,将高成本的操作替换为低成本操作的过程。
    在这里插入图片描述

1.5 DataSet 是什么

DataSet 是分布式数据集合。DataSet 是 Spark 1.6 中添加的一个新抽象,是 DataFrame的一个扩展。它提供了 RDD 的优势(强类型,使用强大的 lambda 函数的能力)以及 Spark SQL 优化执行引擎的优点。DataSet 也可以使用功能性的转换(操作 map,flatMap,filter等等)。

➢ DataSet 是 DataFrame API 的一个扩展,是 SparkSQL 最新的数据抽象

➢ 用户友好的 API 风格,既具有类型安全检查也具有 DataFrame 的查询优化特性;

➢ 用样例类来对 DataSet 中定义数据的结构信息,样例类中每个属性的名称直接映射到DataSet 中的字段名称;

➢ DataSet 是强类型的。比如可以有 DataSet[Car],DataSet[Person]。

➢ DataFrame 是 DataSet 的特列,DataFrame=DataSet[Row] ,所以可以通过 as 方法将DataFrame 转换为 DataSet。Row 是一个类型,跟 Car、Person 这些的类型一样,所有的表结构信息都用 Row 来表示。获取数据时需要指定顺序。

猜你喜欢

转载自blog.csdn.net/weixin_43554580/article/details/131826459
今日推荐