DDL全称Data Definition Laugnage,是用于定义和管理数据库结构的语句。
1.DDL执行过程
SparkSQL中,DDL的执行过程比较简单,核心是操作元数据,通过对应的元数据管理器catalog来实现。
执行过程分为以下几个步骤:
1.1.通过SparkSession.sql方法提交sql
SparkSQL是基于SparkSession的上层API,SQL的提交也是通过SparkSession.sql方法来实现。过程如下所示:
org.apache.spark.sql.SparkSession.sql() // 通过SparkSession提交SQL任务
tracker = new QueryPlanningTracker
plan = tracker.measurePhase // 生成执行计划
Dataset.ofRows(self, plan, tracker) // 执行SQL任务,并提取sql执行结果
qe = new QueryExecution(sparkSession, plan, tracker) // 生成执行单元
sparkPlan = QueryExecution.createSparkPlan // 生成执行计划
qe.assertAnalyzed() // 任务执行
org.apache.spark.sql.catalyst.analysis.Analyzer.executeAndCheck(plan, tracker)
Analyzer.executeAndTrack(plan, tracker)
org.apache.spark.sql.catalyst.rules.RuleExecutor.execute(plan) // 执行任务
Analyzer.checkAnalysis // 分析结果
new Dataset[Row](qe, RowEncoder(qe.analyzed.schema)) // 返回值
这里省略了SparkSession的初始化过程。
1.2.生成执行任务Execution
//todo 待实现
1.3.任务执行
这里是Catalog具体方法的调用过程,下面以“drop table”语句为例。
org.apache.spark.sql.catalyst.analysis.ResolveSessionCatalog#apply
org.apache.spark.sql.execution.command.DropTableCommand#run
org.apache.spark.sql.hive.HiveSessionCatalog
org.apache.spark.sql.hive.HiveExternalCatalog.dropTable
org.apache.spark.sql.hive.client.HiveClient.dropTable
org.apache.hadoop.hive.ql.metadata.Hive#dropTable