Spark SQL和mysql、hivesql从SQL规范来说都一样
引擎:
sparksql底层执行是spark,执行效率高,分布式
mysql底层执行是InnoDB,当然还有其他的引擎,单节点执行
hivesql底层执行默认是mapreduce,也可以更换为执行速度更快的tez,分布式
对于sql语句来说,都是共同的
例:select id ,name,age from student where age>10;
这个标准sql可以在任意引擎中执行。
select 是结果展现
from 是数据来源
where是过滤条件,可以是非必要,但通常来说是必要的
mysql引擎具体执行我没研究过,这里简单说一下hive和spark
hive执行四层架构:
解析器:将SQL字符串转换成抽象语法树AST
编译器:将AST编译生成逻辑执行计划
优化器:对逻辑执行计划进行优化
执行器:把逻辑执行计划转换成可以运行的物理计划,对hive来说就是MR\Spark
Spark SQL的运行架构
sparksql先会将SQL语句进行解析(parse)形成一个Tree,然后使用Rule对Tree进行绑定,优化等处理过程,通过模式匹配对不同类型的节点采用不同操作。而sparksql的查询优化器是catalyst,它负责处理查询语句的解析,绑定,优化和生成物理执行计划等过程,catalyst是sparksql最核心部分。
Spark SQL由core,catalyst,hive和hive-thriftserver4个部分组成。
core: 负责处理数据的输入/输出,从不同的数据源获取数据(如RDD,Parquet文件和JSON文件等),然后将结果查询结果输出成Data Frame。
catalyst: 负责处理查询语句的整个处理过程,包括解析,绑定,优化,生成物理计划等。
hive: 负责对hive数据的处理。
hive-thriftserver:提供client和JDBC/ODBC等接口。
运行原理原理分析:
1.使用SesstionCatalog保存元数据
在解析sql语句前需要初始化sqlcontext,它定义sparksql上下文,在输入sql语句前会加载SesstionCatalog,初始化sqlcontext时会把元数据保存在SesstionCatalog中,包括库名,表名,字段,字段类型等。这些数据将在解析未绑定的逻辑计划上使用。
2.使用Antlr生成未绑定的逻辑计划
Spark2.0版本起使用Antlr进行词法和语法解析,Antlr会构建一个按照关键字生成的语法树,也就是生成的未绑定的逻辑计划。
3.使用Analyzer绑定逻辑计划
在这个阶段Analyzer 使用Analysis Rules,结合SessionCatalog元数据,对未绑定的逻辑计划进行解析,生成已绑定的逻辑计划。
4.使用Optimizer优化逻辑计划
Opetimize(优化器)的实现和处理方式同Analyzer类似,在该类中定义一系列Rule,利用这些Rule对逻辑计划和Expression进行迭代处理,达到树的节点的合并和优化。
5.使用SparkPlanner生成可执行计划的物理计划
SparkPlanner使用Planning Strategies对优化的逻辑计划进行转化,生成可执行的物理计划。
6.使用QueryExecution执行物理计划
// 创建SparkSession类。从2.0开始逐步替代SparkContext称为Spark应用入口
var spark = SparkSession.builder().appName("appName").master("local").getOrCreate()
//创建数据表并读取数据
spark.read.json("./test.json").createOrReplaceTempView("test_table")
//通过SQL进行数据分析。可输入任何满足语法的语句
spark.sql("select name from test_table where a > 1").show()
sql语句首先是生成逻辑计划,然后是物理计划
TreeNode体系
TreeNode是SparkSQL中所有树节点的基类,定义了通用集合操作和树遍历结构
Expression体系
一般指不需要触发执行引擎也能直接计算的单元,如四则运算,逻辑、转换、过滤等。主要定义5个方面的操作:
内部数据系统