一、概述

Spark SQL Extensions 提供了一种灵活的机制,使得 Spark 用户可以在 SQL 解析的 Parser、Analyzer、Optimizer 以及 Planner 等阶段进行自定义扩展,包括自定义 SQL 语法解析、新增数据源等等。

二、设计

SparkSessionExtensions 保存了用户自定义的扩展规则,包含以下方法:

• $buildResolutionRules$ 构建扩展规则添加到 Analyzer 的 resolution 阶段

• $injectResolutionRule$ 向 Analyzer 的 resolution 阶段注册扩展规则生成器

• buildPostHocResolutionRules:构建扩展规则添加到 Analyzer 的 post-hoc resolution 阶段

• injectPostHocResolutionRule:向 Analyzer 的 post-hoc resolution 阶段注册扩展规则生成器

• buildCheckRules:构建扩展检查规则,该规则将会在 analysis 阶段之后运行,用于检查 LogicalPlan 是否存在问题

• injectCheckRule:注册扩展检查规则生成器

• buildOptimizerRules:构建扩展优化规则,将在 optimizer 阶段被调用执行

• injectOptimizerRule:注册扩展优化规则生成器

• buildPlannerStrategies:构建扩展物理执行计划策略,用于将 LogicalPlan 转换为可执行文件

• injectPlannerStrategy:注册扩展物理执行计划策略生成器

• buildParser:构建扩展解析规则

• injectParser:注册扩展解析规则生成器

基于 Spark SQL Extensions 机制实现自定义规则首先编写类实现 Function1[SparkSessionExtensions, Unit] ,SparkSessionExtensions 作为函数入参,调用 SparkSessionExtensions 对应方法将自定义的解析规则注册到对应的 SQL 解析阶段执行,然后将编写的类通过参数 spark.sql.extensions 指定注册到 Spark 中。

三、实现

3.1. 加载 Extensions

3.2. 应用 Extensions