Spark-源码学习-SparkSQL-架构设计-SQL 引擎-数据结构-TreeNode-QueryPlan-LogicalPlan-Command 体系
一、概述
Spark SQL command 主要指的是一些 non-query 逻辑计划。
二、设计
2.1. AnalysisOnlyCommand
仅解析(analyzed) 子节点,不优化 (optimized) 子节点的命令。
HandleSpecialCommand
处理完成 analysis 时需要通知的特殊命令的规则。
HandleSpecialCommand 规则应在所有其他分析规则运行后运行。
1 | object HandleSpecialCommand extends Rule[LogicalPlan] { |
2.2. UnaryCommand
2.2.1. AlterTableCommand
AlterTableCommand 用于在已有的表中添加、修改或删除列等表结构修改 (TableChange)。
2.2.2. V2PartitionCommand
分区 Command: 包括删除/增加/修改…
2.2.3. V2WriteCommand
DataSource V2 数据写入命令。
- RowLevelWrite
2.2.4. DatawritingCommand
- V1WriteCommand
- 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方法中被引用,这样命令的运行方法就可以被立即执行。