Spark-源码学习-SparkSQL-架构设计-SQL 引擎-数据结构-TreeNode-Expression
一、概述Expression 是 Catalyst 中的表达式体系。
二、实现在 Expression 类中,主要定义了包括基本属性、核心操作、输入输出、字符串表示和等价性判断
核心操作 $eval$ 函数实现了表达式对应的处理逻辑,也是其他模块调用该表达式的主要接口,而 $genCode$ 和 $doGenCode$ 用于生成表达式对应的 Java 代码。字符串表示用于查看该 Expression 的具体内容,如表达式名和输入参数等。
2.1. 属性2.1.1. deterministic标记表达式是否为确定性的,即每次执行 $eval$ 函数的输出是否都相同。如果在固定输入值的情况下返回值相同,该标记为true;如果在固定输入值的情况下返回值是不确定的,则说明该 expression 是不确定的,deterministic 参数应该为 false。
1lazy val deterministic: Boolean = children.forall(_.deterministic)
2.1.2. _references表示该 Expression 中会涉及的属性值 ...
Spark-源码学习-SparkSQL-架构设计-SQL 引擎-数据结构-TreeNode-QueryPlan-LogicalPlan
一、概述Spark SQL 逻辑计划在实现层面被定义为 LogicalPlan 类。LogicalPlan 作为数据结构记录了对应逻辑算子树节点的基本信息和基本操作,包括输入输出和各种处理逻辑等。
二、实现LogicalPlan 属于 TreeNode 体系,继承自 QueryPlan 父类。
2.1. 结构LogicalPlan 继承自 QueryPlan,包含了两个成员变量和多个方法。
2.1.1. 成员变量
resolved,用来标记该 LogicalPlan 是否为经过了解析
canonicalized,重载了 QueryPlan 中的对应赋值,默认实现消除了子查询别名之后的 LogicalPlan。
三、继承体系LogicalPlan 仍然是抽象类,根据子节点数目,绝大部分的 LogicalPlan 可以分为 3 类,即叶子节点 LeafNode 类型(不存在子节点)、一元节点 UnaryNode 类型(仅包含一个子节点)和二元节点 BinaryNode 类型(包含两个子节点)。此外,还有几个子类直接继承自 LogicalPlan,不属于这 3 种类型。
3.1. ...
Spark-源码学习-SparkSQL-架构设计-SQL 引擎-数据结构-TreeNode 体系
一、概述无论是逻辑计划还是物理计划,都离不开中间数据结构。在 Catalyst 中,对应的是 TreeNode 体系。TreeNode 类是 SparkSQL 中所有树结构的基类,定义了一系列通用的集合操作和树遍历操作接口。
二、实现2.1. 属性TreeNode 内部包含一个 Seq[BaseType] 类型的变量 children 来表示孩子节点。TreeNode 定义了 foreach、 map、collect 等针对节点操作的方法,以及 transformUp 和 transformDown 等遍历节点并对匹配节点进行相应转换的方法。TreeNode 本身是 scala.Product 类型,因此可以通过 productElement 函数或 productlterator 迭代器对 Case Class 参数信息进行素引和遍历。
TreeNode 一直在内存里维护,不会 dump 到磁盘以文件形式存储,且无论在映射逻辑执行计划阶段,还是优化逻辑执行计划阶段,树的修改都是以替换己有节点的方式进行的。
作为基础类,TreeNode 本身仅提供了最简单和最基本的操作。 Tr ...
Spark-源码学习-SparkSQL-架构设计-SQL 引擎-Parser 模块-AstBuilder-QueryContext
一、概述QueryContext 可以视为 query 语句的根结点~
二、源码12345override def visitQuery(ctx: QueryContext): LogicalPlan = withOrigin(ctx) { val query = plan(ctx.queryTerm).optionalMap(ctx.queryOrganization)(withQueryResultClauses) // Apply CTEs query.optionalMap(ctx.ctes)(withCTE)}
2.1. Query1val query = plan(ctx.queryTerm).optionalMap(ctx.queryOrganization)(withQueryResultClauses)
2.1.1. ctx.queryTerm在 QueryContext 的子节点中查找第一个是 QueryTermContext 类型的节点。AstBuilder 的 $plan$ 方法继续调用 QueryTermCont ...
Spark-源码学习-SparkSQL-架构设计-Parser 模块-AstBuilder-RegularQuerySpecificationContext
一、概述当整个解析过程访问到 RegularQuerySpecification 节点时,执行逻辑可以看作两部分: 首先访问 FromClauseContext 子树, 生成名为 from 的 LogicalPlan; 接下来,调用 withQuerySpecification 方法在 from 的基础上完成后续扩展。
12345678910111213141516override def visitRegularQuerySpecification( ctx: RegularQuerySpecificationContext): LogicalPlan = withOrigin(ctx) { val from = OneRowRelation().optional(ctx.fromClause) { visitFromClause(ctx.fromClause) } withSelectQuerySpecification( ctx, ctx.selectClause, ctx.la ...
Spark-源码学习-SparkSQL-架构设计-SQL 引擎-Parser 模块-ParserDriver
二、实现2.1. $parsePlan$调用 $sqlParser.parsePlan$ 执行 parse,SparkSqlParser 类中没有实现 $parsePlan$ 函数,调用父类 $AbstractSqlParser.parsePlan$:
12345678override def parsePlan(sqlText: String): LogicalPlan = parse(sqlText) { parser => astBuilder.visitSingleStatement(parser.singleStatement()) match { case plan: LogicalPlan => plan case _ => val position = Origin(None, None) throw QueryParsingErrors.sqlStatementUnsupportedError(sqlText, position) }}
$parsePlan$ 函 ...
Spark-源码学习-SparkSQL-架构设计-SQL 引擎-Parser 模块
一、概述SparkSQL 的 Parser 模块负责将 SQL 解析为 LogicalPlan,把整个 SparkSQL Parser 模块分为 构建抽象语法树 和 遍历抽象语法树 两个部分去学习😊~~~
二、Parser 模块架构设计
2.1. 架构设计2.1.1. ParseInterfaceCatalyst 中提供了直接面向用户的 ParseInterface 接口,该接口中包含了对 SQL 语句、Expression 表达式和 TableIdentifier 数据表标识符的解析方法。AbstractSqlParser 是实现了 ParseInterface 的虚类,其中定义了返回 AstBuilder 的函数。
2.1.2. AbstractSqlParser
SparkSqlParser
SparkSQL 的 SparkSqlParser,将 SQL 解析为 LogicalPlan。
CatalystSqlParser
CatalystSqlParser 用于 Catalyst 内部,而 SparkSqlParser 用于外部调用
2.1.3. SqlBas ...
Flink-源码学习-FlinkSQL&Table-执行环境 TableEnvironment
一、概述TableEnvironment 是 Flink Table API 和 Flink SQL 中使用的执行环境,向上对开发者提供了 Flink SQL 使用的相关接口,向下连接Flink的SQL运行时。
TableEnvironment 包含如下职责:
连接到外部数据源
注册 Table 和获取元数据信息。
执行 SQL 语句。
提供 SQL 执行的配置。
二、实现2.1. 架构设计TableEnvironment 是顶级接口,是所有 TableEnvironment 的基类
Flink 将批处理迁移到流计算上,实现了 API 接口到执行层面的统一,以前老版本中 BatchTableEnvironment 已经退出了历史的舞台。StreamTableEnvironment 与 TableEnvironment 接口相比,扩展了与 DataStream 的相互转换能力。
同时社区也在努力推动 Java 和 Scala TableEnvironment 的统一。Flink TableEnvironment 的未来架构会更加简洁,成为推荐使用的接口,只有当需要与 Dat ...
Flink-源码学习-FlinkSQL&Table 系列
一、执行环境TableEnvironment 是 Flink Table API 和 Flink SQL 中使用的执行环境,向上对开发者提供了 Flink SQL 使用的相关接口,向下连接 Flink 的 SQL 运行时。
引用本站文章
Flink-源码学习-FlinkSQL&Table-执行环境 TableEnvironment
Joker
二、TableTable 是 Flink Table API 的核心操作对象,提供了流批统一的数据操作行为定义。对于批处理 Table 是静态表,对于流计算 Table 是动态表。动态表在 Flink 中抽象为 Table 接口。与表示批处理数据的静态表相比,动态表随时间而变化。将 SQL 查询作用于动态表,查询会持续执行而不会终止,叫作连续查询。
引用本站文章
...