Apache Calcite 是一款开源SQL
解析工具, 可以将各种SQL
语句解析成抽象语法术AST(Abstract Syntax Tree)
, 之后通过操作AST
就可以把SQL
中所要表达的算法与关系体现在具体代码之中,将来会有越来越多的数据处理引擎采用Calcite作为SQL
解析工具。
如下图,阿里的blink
框架已经集成了Calcite
的源码:
官方地址:https://calcite.apache.org/
Calcite解析SQL的步骤如下:
Calcite有以下主要功能:
Execute即执行阶段:此阶段主要做的是将物理执行计划转化成可在特定的平台执行的程序,如Hive与Flink都在在此阶段将物理执行计划CodeGen生成相应的可执行代码。
Calcite主要有以下组件:
Catalog:主要定义被SQL访问的命名空间
主要包括以下几点:
Schema:
public interface Schema {
Table getTable(String name);
Set<String> getTableNames();
Set<String> getFunctionNames();
Schema getSubSchema(String name);
Set<String> getSubSchemaNames();
Expression getExpression(SchemaPlus parentSchema, String name);
boolean isMutable();
Table:
public interface Table {
RelDataType getRowType(RelDataTypeFactory typeFactory);
Statistic getStatistic();
Schema.TableType getJdbcTableType();
}
其中RelDataType代表Row的数据类型, Statistic 用于统计表的相关数据、特别是在CBO用于计表计算表的代价。
一句Sql:
selcct id, name, cast(age as bigint) from A.INFO
- id, name则为data type field
- bigint为 data type
- A 为schema
- INFO 为表
SQL Parser:由Java CC编写,将SQL转化成AST.
例如SQL如下:
cast(id as float)
Java CC 可表示为:
<CAST>
<LPAREN>
e = Expression(ExprContext.ACCEPT_SUBQUERY)
<AS>
dt = DataType() {agrs.add(dt);}
<RPAREN>
....
还有Query Optimizer这些内容,本文不再详述:
具体的用法可以参考:
参考资料:https://www.jianshu.com/p/2dfbd71b7f0f
本文主要讲解了Apache Calcite的功能、组件及用法,希望能帮助到大家,谢谢大家的阅读,本文完!