如何实现一个SQL解析器( 七 )

2.实现代码

Calcite示例代码
如何实现一个SQL解析器

文章插图
package com.vivo.learn.sql.calcite;import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONArray;import com.alibaba.fastjson.JSONObject;import org.smartloli.util.JSqlUtils;public class JSqlClient {public static void main(String[] args) {JSONObject tabSchema = new JSONObject();tabSchema.put("id","integer");tabSchema.put("name","varchar");JSONArray datasets = JSON.parseArray("[{\"id\":1,\"name\":\"aaa\",\"age\":20},{\"id\":2,\"name\":\"bbb\",\"age\":21},{\"id\":3,\"name\":\"ccc\",\"age\":22}]");String tabName = "userinfo";String sql = "select count(*) as cnt from \"userinfo\"";try{String result = JSqlUtils.query(tabSchema,tabName,datasets,sql);System.out.println("result: "+result);}catch (Exception e){e.printStackTrace();}}}3.预览截图
如何实现一个SQL解析器

文章插图
4.3.3 对比结果
如何实现一个SQL解析器

文章插图
综合对比,我们从对两种技术的学习成本、使用复杂度、以及灵活度来对比,可以优先选择Calcite来作为SQL解析器来处理实际的业务需求 。
五、总结另外,在单机模式的情况下,执行计划可以较为简单的翻译成执行代码,但是在分布式领域中,因为计算引擎多种多样,因此,还需要一个更加贴近具体计算引擎的描述,也就是物理计划 。换言之,逻辑计划只是抽象的一层描述,而物理计划则和具体的计算引擎直接挂钩 。
如何实现一个SQL解析器

文章插图
满足上述场景,通常都可以引入SQL解析器:
  • 给关系型数据库(比如MySQL、Oracle)这类提供定制化的SQL来作为交互查询;
  • 给开发人员提供了JDBC、ODBC之类和各种数据库的标准接口;
  • 对数据分析师等不太会编程语言的但又需要使用数据的人;
  • 大数据技术组件不自带SQL的;
参考资料:
  1. https://github.com/smartloli/EFAK
  2. https://github.com/antlr/antlr4
  3. https://github.com/antlr/grammars-v4
  4. https://github.com/apache/calcite
【如何实现一个SQL解析器】

经验总结扩展阅读