第1章 SparkSQL 概述

1.1 SparkSQL 是什么

第1章 SparkSQL 概述_第1张图片
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 引擎上。
第1章 SparkSQL 概述_第2张图片
Shark 的出现,使得 SQL-on-Hadoop 的性能比 Hive 有了 10-100 倍的提高。

第1章 SparkSQL 概述_第3张图片

  • 但是,随着 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 的语法解析器、分析器还是优化器都可以重新定义,进行扩展。
第1章 SparkSQL 概述_第4张图片
2014 年 6 月 1 日 Shark 项目和 SparkSQL 项目的主持人 Reynold Xin 宣布:停止对 Shark 的开发,团队将所有资源放 SparkSQL 项目上,至此,Shark 的发展画上了句话,但也因此发展出两个支线:SparkSQL 和 Hive on Spark。

第1章 SparkSQL 概述_第5张图片

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章 SparkSQL 概述_第6张图片

1.3.2 统一的数据访问

使用相同的方式连接不同的数据源
第1章 SparkSQL 概述_第7张图片

1.3.3 兼容 Hive

在已有的仓库上直接运行 SQL 或者 HiveQL
第1章 SparkSQL 概述_第8张图片

1.3.4 标准数据连接

通过 JDBC 或者 ODBC 来连接
第1章 SparkSQL 概述_第9张图片

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 要更加友好,门槛更低。

第1章 SparkSQL 概述_第10张图片
上图直观地体现了 DataFrame 和 RDD 的区别。

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

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 来表示。获取数据时需要指定顺序。

你可能感兴趣的:(#,spark,SQL,大数据,spark,hive)