一、概述

Spark SQL command 主要指的是一些 non-query 逻辑计划。

二、设计

2.1. AnalysisOnlyCommand

仅解析(analyzed) 子节点,不优化 (optimized) 子节点的命令。

HandleSpecialCommand 处理完成 analysis 时需要通知的特殊命令的规则。

HandleSpecialCommand 规则应在所有其他分析规则运行后运行。

1
2
3
4
5
6
7
8
object HandleSpecialCommand extends Rule[LogicalPlan] {
override def apply(plan: LogicalPlan): LogicalPlan = plan.resolveOperatorsWithPruning(_.containsPattern(COMMAND)) {
case c: AnalysisOnlyCommand if c.resolved =>
checkAnalysis(c)
c.markAsAnalyzed(AnalysisContext.get)
case c: KeepAnalyzedQuery if c.resolved => c.storeAnalyzedQuery()
}
}

2.2. UnaryCommand

2.2.1. AlterTableCommand

AlterTableCommand 用于在已有的表中添加、修改或删除列等表结构修改 (TableChange)。

2.2.2. V2PartitionCommand

分区 Command: 包括删除/增加/修改…

2.2.3. V2WriteCommand

DataSource V2 数据写入命令。

  1. RowLevelWrite

2.2.4. DatawritingCommand

  1. V1WriteCommand
  2. SaveAsHiveFile

2.3. LeafCommand

2.4. BinaryCommand

2.5. RunnableCommand

RunnableCommand 是可以直接运行的命令,通常是用于与 Spark SessionCatalog 交互和管理元数据的命令,包括 Database 相关命令、Table 相关命令、View 相关命令、DDL相关命令、Function 相关命令和 Resource 相关命令等。

RunnableCommand 定义了一个抽象的 $run()$ 方法,这个方法需要被子命令的具体实现所重写。

2.6.1. LeafRunnableCommand 接口

2.6.2. 执行流程

可执行命令通常是用于与 Spark session catalog 交互和管理元数据的命令。与 Spark 中分布式和延迟执行的类似数据查询的操作不同,可执行命令只在driver端执行。

RunnableCommand是一个逻辑计划,它是不可执行的。可执行命令的物理执行是由 ExecutedCommandExec 物理运算符运行的。在ExecutedCommandExec中定义了一个lazy关键字修饰的字段sideEffectResult,它包装了由command的run方法执行引起的任何副作用。sideEffectResult变量在doExecute方法中被引用,这样命令的运行方法就可以被立即执行。

图片