网站首页模块如何做链接,东莞做网站的公司吗,全网引流推广 价格,wordpress 评论数量我们在之前的文章中#xff0c;介绍了 Doris 官方提供的两种方言转换工具#xff0c;分别是 sql convertor 和方言 plugin。StarRocks 目前同样也提供了类似的方言转换功能。本文我们就一起来看一下这个功能的实现与 Doris 相比有何不同。
一、Trino 方言验证
我们可以通过…我们在之前的文章中介绍了 Doris 官方提供的两种方言转换工具分别是 sql convertor 和方言 plugin。StarRocks 目前同样也提供了类似的方言转换功能。本文我们就一起来看一下这个功能的实现与 Doris 相比有何不同。
一、Trino 方言验证
我们可以通过如下 SQL 来验证 Trino 的方言转换在 SR 中的效果
set enable_profile true;
set sql_dialect starrocks;
select BOROUGH, approx_count_distinct(ZIP_CODE) cnt from crashdata group by BOROUGH order by cnt desc;
set sql_dialect trino;
select BOROUGH, approx_distinct(ZIP_CODE) cnt from crashdata group by BOROUGH order by cnt desc;针对上述查询我们在 SR 集群执行结果如下所示
可以看到执行结果完全一致说明方言转换已经生效并且符合预期。通过 WebUI 查看提交的两条 SQL
页面上显示的仍然是原始的 SQL 而不是改写之后的。如果在 SR 的方言下执行 SQL2 的话那么会直接报错如下所示
提示函数找不到这也是符合预期的因为 approx_distinct 这个函数在 SR 中是不存在的。下面我们就结合代码来看一下 SR 是如何实现这个方言转换功能的。
二、Trino AST 简介
由于 Trino 的方言支持主要思路是将 Trino 的相关结构转换成 SR 的结构因此这里先简单了解下 Trino 的 AST 相关结构
后续提到的相关结构就可以直接参考上述图片。
三、Trino Transformer 介绍
SR 在 FE 中实现了一套 transformer 可以将 Trino 的 function 转换为 SR 的 function从而实现了方言转换的功能。
3.1 整体流程图
整个 parse 的相关流程如下所示
上述流程可以分为如下几个步骤
FE 启动的时候Trino2SRFunctionCallTransformer 会通过静态方法将所有 Trino 到 SR 的函数映射注册到 TRANSFORMER_MAP 这个 map 中FE 调用 Trino 的 SqlParser 将 sql string 转换为 Trino 的 Statement 结构可以参考上述的 AST 结构图在 trino/AstBuilder 中将 Trino 的 Statement 转换为 SR 的 StatementBasetransformer 用于进行函数转换根据 sql 中的 Trino 函数名在 Map 中进行匹配找到对应的 FunctionCallTransformer在 FunctionCallTransformer 中构造 FunctionCallRewriter最终返回至 trino/AstBuilder完成函数的转换继续后续的其他操作最终生成 SR 的 StatementBase结构完成 parse 操作。
这里我们来一一看下对应的操作。
3.2 函数映射注册
Trino 到 SR 的函数映射注册代码位于 Trino2SRFunctionCallTransformer 中这个类在加载的时候会完成对应的函数映射注册如下所示
private static void registerAllFunctionTransformer() {registerAggregateFunctionTransformer();registerArrayFunctionTransformer();registerDateFunctionTransformer();registerStringFunctionTransformer();registerRegexpFunctionTransformer();registerJsonFunctionTransformer();registerURLFunctionTransformer();registerBitwiseFunctionTransformer();registerUnicodeFunctionTransformer();registerMapFunctionTransformer();registerBinaryFunctionTransformer();// todo: support more function transform
}以 registerAggregateFunctionTransformer 为例这里负责对聚合函数的映射进行注册相关代码如下所示
private static void registerAggregateFunctionTransformer() {// 1.approx_distinctregisterFunctionTransformer(approx_distinct, 1,approx_count_distinct, ImmutableList.of(Expr.class));// 2. arbitraryregisterFunctionTransformer(arbitrary, 1,any_value, ImmutableList.of(Expr.class));// 3. approx_percentileregisterFunctionTransformer(approx_percentile, 2,percentile_approx, ImmutableList.of(Expr.class, Expr.class));通过这个函数的映射Trino 的 approx_distinct 函数就会被转换成 SR 的 approx_count_distinct对应的结构体转换如下所示
可以看到最终在 map 中保存了 approx_distinct 这个 Trino 函数到 SR 的映射。需要注意的是map 的 value 是一个 list主要是为了处理参数不同的重载函数。通过 debug 可以直接查看已经注册的函数映射
其中PlaceholderExpr 就是用来保存 SR 函数的输入参数主要就是 index 和 参数的类型后续用于进行匹配最终会被替换成实际的函数参数位于 FunctionCallRewriter 的 sourceArguments 中。
3.3 Transformer 匹配
在 FE 启动之后Trino 的函数映射已经全部注册完成。当我们通过设置方言为 trino 之后首先需要根据 Trino 的函数名去 map 中进行匹配由于重载函数的存在因此还需要比较对应的参数类型。相关的函数调用如下所示
parse(SqlParser.java):56
--parseWithTrinoDialect(SqlParser.java):68/74
---toStatement(TrinoParserUtils.java):42
----accept(io/trino/sql/tree/Statement.java)
// 省略部分函数调用栈
-visitFunctionCall(trino/AstBuilder.java):713
--convert(Trino2SRFunctionCallTransformer.java):47
---convertRegisterFn(Trino2SRFunctionCallTransformer.java):62
----match(FunctionCallTransformer.java)其中match函数的参数为 ListExpr对应的就是 2.1 中 ListExpression 转换后的结果即将 Trino 的 Expression 转换为 SR 中的 Expr 结构。匹配的过程主要分为两步
比较参数个数是否一致比较每一个 PlaceholderExpr 的类型是否是实际参数类型的超类。
两个条件都满足的话则证明这个 transformer 是相符的则继续进行后续的转换。
3.4 函数转换
转换操作主要就是生成一个 FunctionCallRewriter 对象相关的函数调用如下所示
visitFunctionCall(trino/AstBuilder.java):713
-convert(Trino2SRFunctionCallTransformer.java):47
--convertRegisterFn(Trino2SRFunctionCallTransformer.java):69
---transform(FunctionCallTransformer.java):113
----ctor(FunctionCallRewriter.java)我们通过 debug 分别对比下 Trino 和 SR 中的function call 的结构如下所示
可以看到最终生成的 FunctionCallRewriter 中已经包含了具体的参数即 ZIP_CODE 这个列对应的类型是 SlotRef而 2.2 中的 PlaceholderExpr 只有类型信息即 ExprSlotRef是其一个子类所以类型可以匹配上。
四、总结
4.1 与 Doris 方言功能比较
由于 Doris 的 sql convertor 工具是借助 SqlGlot 实现的因此与 Doris 本身关系不大。这里我们主要比较下 Doris 的方言 plugin 与 SR 的 transformer 优缺点
方言功能优点缺点SR Transformer实现比较完善支持各种函数转换与SR代码耦合紧并且仅支持Trino扩展性一般Doris Plugin通过Plugin的方法与Doris代码进行了解耦扩展性相对较好目前支持Trino和Spark实现比较简单函数转换未提供并且存在一些问题可用性较差
4.2 思考小结
由于目前 SR 官方只支持 Trino 的方言转换并且与源码耦合比较紧如下所示
// SqlParser.java
public static ListStatementBase parse(String sql, SessionVariable sessionVariable) {if (sessionVariable.getSqlDialect().equalsIgnoreCase(trino)) {return parseWithTrinoDialect(sql, sessionVariable);} else {return parseWithStarRocksDialect(sql, sessionVariable);}
}如果想要完整的支持一种新的方言转换需要实现对应的 FunctionCallTransformer 和 AstBuilder并修改上述的 if-else总体代码开发量比较大。此外本文的所有内容是笔者基于 StarRocks-3.3 版本分析、总结而来如有错误欢迎指正。
五、参考文档
sql_dialect[Feature] Support Trino parser on StarRocks #14830 文章转载自: http://www.morning.fgqbx.cn.gov.cn.fgqbx.cn http://www.morning.sqqkr.cn.gov.cn.sqqkr.cn http://www.morning.mkbc.cn.gov.cn.mkbc.cn http://www.morning.xclgf.cn.gov.cn.xclgf.cn http://www.morning.ndhxn.cn.gov.cn.ndhxn.cn http://www.morning.xtkw.cn.gov.cn.xtkw.cn http://www.morning.xhhzn.cn.gov.cn.xhhzn.cn http://www.morning.rwpjq.cn.gov.cn.rwpjq.cn http://www.morning.sfwfk.cn.gov.cn.sfwfk.cn http://www.morning.wpspf.cn.gov.cn.wpspf.cn http://www.morning.ylqrc.cn.gov.cn.ylqrc.cn http://www.morning.fkwp.cn.gov.cn.fkwp.cn http://www.morning.rydbs.cn.gov.cn.rydbs.cn http://www.morning.cwgpl.cn.gov.cn.cwgpl.cn http://www.morning.rttp.cn.gov.cn.rttp.cn http://www.morning.rdlfk.cn.gov.cn.rdlfk.cn http://www.morning.gstg.cn.gov.cn.gstg.cn http://www.morning.hcsnk.cn.gov.cn.hcsnk.cn http://www.morning.tmtrl.cn.gov.cn.tmtrl.cn http://www.morning.sacxbs.cn.gov.cn.sacxbs.cn http://www.morning.qkrz.cn.gov.cn.qkrz.cn http://www.morning.bfbl.cn.gov.cn.bfbl.cn http://www.morning.ktmpw.cn.gov.cn.ktmpw.cn http://www.morning.nypsz.cn.gov.cn.nypsz.cn http://www.morning.ppbrq.cn.gov.cn.ppbrq.cn http://www.morning.nmngg.cn.gov.cn.nmngg.cn http://www.morning.zlmbc.cn.gov.cn.zlmbc.cn http://www.morning.nhrkc.cn.gov.cn.nhrkc.cn http://www.morning.nbsfb.cn.gov.cn.nbsfb.cn http://www.morning.brbnc.cn.gov.cn.brbnc.cn http://www.morning.dbqg.cn.gov.cn.dbqg.cn http://www.morning.xxsrm.cn.gov.cn.xxsrm.cn http://www.morning.hwnqg.cn.gov.cn.hwnqg.cn http://www.morning.kzqpn.cn.gov.cn.kzqpn.cn http://www.morning.zycll.cn.gov.cn.zycll.cn http://www.morning.jbblf.cn.gov.cn.jbblf.cn http://www.morning.wkmrl.cn.gov.cn.wkmrl.cn http://www.morning.gmwqd.cn.gov.cn.gmwqd.cn http://www.morning.pqnpd.cn.gov.cn.pqnpd.cn http://www.morning.xqjrg.cn.gov.cn.xqjrg.cn http://www.morning.rqqct.cn.gov.cn.rqqct.cn http://www.morning.lksgz.cn.gov.cn.lksgz.cn http://www.morning.dtrz.cn.gov.cn.dtrz.cn http://www.morning.fcwxs.cn.gov.cn.fcwxs.cn http://www.morning.wrbf.cn.gov.cn.wrbf.cn http://www.morning.tklqs.cn.gov.cn.tklqs.cn http://www.morning.jqpyq.cn.gov.cn.jqpyq.cn http://www.morning.mhmsn.cn.gov.cn.mhmsn.cn http://www.morning.wjxyg.cn.gov.cn.wjxyg.cn http://www.morning.gllhx.cn.gov.cn.gllhx.cn http://www.morning.ktdqu.cn.gov.cn.ktdqu.cn http://www.morning.kybpj.cn.gov.cn.kybpj.cn http://www.morning.jrlxz.cn.gov.cn.jrlxz.cn http://www.morning.rfxg.cn.gov.cn.rfxg.cn http://www.morning.jbhhj.cn.gov.cn.jbhhj.cn http://www.morning.sqskm.cn.gov.cn.sqskm.cn http://www.morning.dzdtj.cn.gov.cn.dzdtj.cn http://www.morning.dktyc.cn.gov.cn.dktyc.cn http://www.morning.ckfyp.cn.gov.cn.ckfyp.cn http://www.morning.dnmzl.cn.gov.cn.dnmzl.cn http://www.morning.rmrcc.cn.gov.cn.rmrcc.cn http://www.morning.xrwbc.cn.gov.cn.xrwbc.cn http://www.morning.hcwlq.cn.gov.cn.hcwlq.cn http://www.morning.yodajy.cn.gov.cn.yodajy.cn http://www.morning.fwmln.cn.gov.cn.fwmln.cn http://www.morning.kbgzj.cn.gov.cn.kbgzj.cn http://www.morning.ysmw.cn.gov.cn.ysmw.cn http://www.morning.hqrr.cn.gov.cn.hqrr.cn http://www.morning.ryzgp.cn.gov.cn.ryzgp.cn http://www.morning.rjkfj.cn.gov.cn.rjkfj.cn http://www.morning.xjpnq.cn.gov.cn.xjpnq.cn http://www.morning.lsbjj.cn.gov.cn.lsbjj.cn http://www.morning.wrtbx.cn.gov.cn.wrtbx.cn http://www.morning.byjwl.cn.gov.cn.byjwl.cn http://www.morning.lgmty.cn.gov.cn.lgmty.cn http://www.morning.rywn.cn.gov.cn.rywn.cn http://www.morning.pflpb.cn.gov.cn.pflpb.cn http://www.morning.xqzrg.cn.gov.cn.xqzrg.cn http://www.morning.snbrs.cn.gov.cn.snbrs.cn http://www.morning.nsfxt.cn.gov.cn.nsfxt.cn