从入行做数据库开发,到2018年过渡到大数据开发,可以说我已经与sql朝夕相处了七八年了,经常惊讶于简单的语法就能产生复杂的操作,而且还能根据索引等统计信息自动优化,不禁很想实现自己的sql语法,却不知道这是怎么做到的,繁忙的工作、庞大的语法解析及优化的储备知识让我迟迟难以行动起来,但只要出现契机并敢于把握,这些困难都不算什么。

一个契机

我在捣鼓Flink发行版时,建了很多库和表,每次要看一个库的表时都要切到对应的库,切过去以后也只能在200多个表的库中肉眼寻找想要的表,记得在使用mysql时可以很方便地使用 `show tables from ... like ...` 语法完美解决这个问题,心想如果Flink也支持这个特性就好了,在经过短暂的思想斗争后终于下决心解决这个心头刺。然后我就开始研究Flink sql模块的语法解析部分,发现Calcite使用freemaker模板引擎,并在底层借助JavaCC做语法解析器,而定义新的sql语法必然要用到语法解析器,很快大致方案便定了下来:

  • 背景知识巩固:语法解析原理,freemaker模板引擎,JavaCC

    • 相关JavaCC和Calcite的开发代码可以在https://github.com/liyubin117/JavaTest代码仓库里看到
  • 熟悉Flink sql与Calcite集成
    • 参考社区`show columns`语法的实现,https://issues.apache.org/jira/browse/FLINK-22885
  • 参考spark、mysql等流行引擎定义语法格式
    • SHOW TABLES [ ( FROM | IN ) [catalog_name.]database_name ] [ [NOT] LIKE <sql_like_pattern> ]
  • 开发Flink sql新语法

虽然事后看来这个方案理所当然,但其实中间遇到了很多坎,尤其是没有人可以请教。

行动起来

在经过半个多月的细节敲定和反复验证后,终于按方案完成了功能,然后美滋滋地编译打包进行验证,却发现结果与预料的不一样,不管`from`子句后面跟哪个库,都只会显示当前库的表,心里有些发虚,好消息`like`子句经验证是正常的,又壮了壮信心。我回头看了下所有的实现,都没发现问题,会不会是调用的底层接口有问题。我在实现时使用了内核提供的CatalogManager.listTables接口,一查果然有bug,只是由于之前Flink不支持我实现的这个功能,所以问题没暴露出来,很快我把这个问题修复后,向社区提了JIRA(https://issues.apache.org/jira/browse/FLINK-25369),社区的人很热情,很快就对我回复了,然后我提交了代码被合到了master分支。

FLINK-25369被社区合入后,重头戏来了,我终于向社区提了`show tables`高级语法特性(https://issues.apache.org/jira/browse/FLINK-25631),这是一个涉及近千行代码的大工程,虽然之前也做过一些贡献,但没贡献过这么复杂的功能,有些担心。云邪老师人很nice,很耐心地帮我review代码并提了些我之前未意识到的问题,高手确实是高手。

终于在2022年3月4号那天FLINK-25631被合进官方代码仓库,oh yeah!

聊聊FLINK-25631贡献的更多相关文章

  1. Flink资料(8) -- Flink代码贡献的指导及准则

    本文翻译自Contributing Code ----------------------------------------- Apache Flink是由自愿的代码贡献者维护.优化及扩展的.Apa ...

  2. 聊聊flink的NetworkEnvironmentConfiguration

    本文主要研究一下flink的NetworkEnvironmentConfiguration NetworkEnvironmentConfiguration flink-1.7.2/flink-runt ...

  3. 聊聊flink的CsvTableSource

    序 本文主要研究一下flink的CsvTableSource TableSource flink-table_2.11-1.7.1-sources.jar!/org/apache/flink/tabl ...

  4. 聊聊flink Table的groupBy操作

    本文主要研究一下flink Table的groupBy操作 Table.groupBy flink-table_2.11-1.7.0-sources.jar!/org/apache/flink/tab ...

  5. 聊聊flink的AsyncWaitOperator

    序本文主要研究一下flink的AsyncWaitOperator AsyncWaitOperatorflink-streaming-java_2.11-1.7.0-sources.jar!/org/a ...

  6. 聊聊flink的Async I/O

    // This example implements the asynchronous request and callback with Futures that have the // inter ...

  7. 聊聊flink的log.file配置

    本文主要研究一下flink的log.file配置 log4j.properties flink-release-1.6.2/flink-dist/src/main/flink-bin/conf/log ...

  8. [case49]聊聊flink的checkpoint配置

    序 本文主要研究下flink的checkpoint配置 实例 StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecut ...

  9. 聊聊flink的BlobStoreService

    序 本文主要研究一下flink的BlobStoreService BlobView flink-release-1.7.2/flink-runtime/src/main/java/org/apache ...

  10. 终于等到你!阿里正式向 Apache Flink 贡献 Blink 源码

    摘要: 如同我们去年12月在 Flink Forward China 峰会所约,阿里巴巴内部 Flink 版本 Blink 将于 2019 年 1 月底正式开源.今天,我们终于等到了这一刻. 阿里妹导 ...

随机推荐

  1. 本地存储和cookies之间的区别是什么?

    cookies本地存储客户端/服务器端既可以从客户端也可以从服务器端访问数据.每个请求都会发送cookie数据到服务器.只能在本地浏览器端访问数据.服务器无法访问本地存储,除非特意通过POST或GET ...

  2. 基于redis实现未登录购物车

    springboot 工程 主要说明购物车流程(故将登录用户信息保存至session) 未登录时 将用户临时key 保存至cookie 有不足之处 请大佬指点 项目源码: https://github ...

  3. Python - dict类型

  4. 遇到问题之“postman报Unsupported Media Type: Content type 'text/plain;charset=UTF-8' not supported”

    postman报Unsupported Media Type: Content type 'text/plain;charset=UTF-8' not supported postman之所以报Uns ...

  5. Python学习--21天Python基础学习之旅(Day08-Day21)

    Day08: Chapter 11 异常 1.1如果try代码块中代码运行没有问题,则运行时跳过except代码块.(有异常时执行except中的代码,没有异常则跳过except中的代码) try-e ...

  6. 解决Mui中popover 顶部弹出菜单弹出位置不准确以及无法收回的问题

    前言 最近公司的项目转向使用Hbuilder开发移动端项目,其中想要通过在顶部标题栏加入弹出菜单的方式,来定位长列表的位置,如图所示. 问题 Mui的功能貌似还不是很完善,在使用这个弹出菜单的时候,发 ...

  7. 深入理解ES6之《扩展对象》

    属性初始值的简写 当对象字面量只有一个属性的名称时,JS引擎会在可访问作用域中查找其同名变量:如果找到则该变量的值被赋给对象字面量里的同名属性 function createPerson(name, ...

  8. ubantu系统之快捷键使用

    1. 文件管理器中,目录切换为可以编辑的状态: ctrl + l 2. gedit 搜索 : ctrl + h

  9. 三种获取数据的方法fetch和ajax和axios

    一 .fetch用法 ( 本人比较喜欢fetch,代码精简,虽说目前axios比较流行,但是fetch很多大厂已经开始用fetch开始封装了, 我觉得以后fetch会取代axios和ajax ) 1. ...

  10. Struts2-day1总结

    1.Struts2的基本执行流程(详见我的博客) 2.Struts2的分模块开发 如果有多个项目的Struts.xml写在一起,容易造成数据混乱,所以可以使用分模块的方法,在项目下新建*.xml配置文 ...