Spark SQL Overview

Overview

Spark SQL由Core、Catalyst、Hive和Hive-Thriftserver四部分组成,分别对应Spark源码中的spark/sql/core、spark/sql/catalyst、spark/sql/hive和spark/sql/hive-thriftserver。

  • Core:用于将Catalyst生成的逻辑执行计划转换为RDD的查询/执行引擎。该组建中还包含一个SQLContext接口,用于对于已经存在的RDD和Parquet文件执行SQL或LINQ语句。
  • Catalyst:负责处理查询语句的整个处理流程,包括解析、绑定、优化、物理计划等。
  • Hive:负责对Hive数据的处理,里面有一个扩展了SQLContext的HiveContext,允许用户使用HQL编写查询语句,并且使用Hive SerDes从Hive Metastore查询数据。还允许你使用UDF、UDAF、UDTF查询。
  • Hive-Thriftserver:提供SQL CLI(bin/spark-sql)和HiveServer2(JDBC/ODBC)兼容服务的支持。

Catalyst是Spark的核心,Spark SQL的执行流程的核心就是Catalyst的执行工作流程。

Dataset/DataFrame

Dataset是从Spark 1.6提供的分布式数据集,它同时提供了RDD(强类型、使用lambda表达式)和Spark SQL(优化执行引擎)各自的优点。Dataset可以通过JVM对象和已有的Dataset转化来构建。Dataset提供了Java和Scala的API。

DataFrame其实要比DataSet出现的早,在Spark1.3版本提供的。DataFrame和DataSet都是在RDD的基础上提供的,DataFrame的使用风格类似R和Pandas风格的DataFrame API,这样大大降低了学习成本。Dataset和DataFrame都是分布式数据集,只不过DataFrame中包含列的命名信息(列的Schema信息),DataFrame在概念上等同于关系数据库中的表和R/Python中的DataFrame。

在Spark2.0以后,Spark团队就把Dataset和DataFrame进行了合并,把DataFrame作为Dataset中一种具有列Schema信息的Row的集合。所以现在就把DataFrame看作Dataset的一种,只不过包含了列的schema信息。现在DataFrame并没有具体的实现类了,而是把它定义为Dataset中Row组成的集合。Dataset/DataFrame和RDD一样,对于转换操作算子是惰性的,只有遇到action算子才会真正执行,这也使得在构建Dataset/DataFrame的所有操作之间可以进行丰富的优化。

1
type DataFrame = Dataset[Row]

注:Spark SQL在Spark 1.0版本上线,当时使用的是SchemaRDD,在Spark 1.3版本提供了DataFrame代替了SchemaRDD,在Spark 1.6版本Spark提出了Dataset,在Spark 2.0将DataFrame合并到Dataset中。

Catalog

SessionCatalog