从入行做数据库开发,到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. Linux 基础优化

    1.操作的最小化原则 1)安装系统最小化 一般情况下安装OS时,软件安装包组(Package Group)的选择: base--------------------------基本环境 editors ...

  2. linux命令手册

    常⻅系统服务命令 常用命令 作用 chkconfig --list 列出系统服务 service <服务名> status 查看某个服务 service <服务名> start ...

  3. labview和matlab区别

    LabVIEW和MATLAB作为本身功能比较完善的软件环境,在各自不同的领域中有着十分广泛的应用.下面小编就详细介绍LabVIEW和MATLA以及它们之间的区别. 一.LabVIEW简介 LabVIE ...

  4. H.265

    Baseline支持I/P 帧,只支持无交错(Progressive)和CAVLC一般用于低阶或需要额外容错的应用,比如视频通话.手机视频等: Main支持I/P/B 帧,无交错(Progressiv ...

  5. 基于Yeoman实现自定义脚手架

    什么是脚手架? Yeoman是什么? 实现自定义脚手架 基于Yeoman实现Vue-cli 一.什么是脚手架? 手脚架从功能上来讲就是创建项目初始文件,这其中包括生成功能模块配置.自动安装依赖.自动生 ...

  6. Wireshark捕获网易云音乐音频文件地址

    打开Wireshark,开始捕获. 打开网易云音乐,然后播放一首歌. Wireshark停时捕获,然后在不活的文件中搜索字符串"mp3".可以发现有如下信息: 将其中的内容:&qu ...

  7. 【论文阅读】ICLR 2022: Scene Transformer: A unified architecture for predicting future trajectories of multiple agents

    ICLR 2022: Scene Transformer: A unified architecture for predicting future trajectories of multiple ...

  8. 实战-DRF快速写接口(认证权限频率)

    实战-DRF快速写接口 开发环境 Python3.6 Pycharm专业版2021.2.3 Sqlite3 Django 2.2 djangorestframework3.13 测试工具 Postma ...

  9. Ubu18.0-NVIDIA显卡驱动重装

    //图片仅供参考,请勿代入 问题情况:电脑装了双系统,WIN10+Ubu,Ubu分辨率不稳定,经常发生变化 显卡型号:打开设备管理器进行查看 解决方法:重装NVIDIA显卡驱动 1.去英伟达官网下载自 ...

  10. MVC:开发模式&&三层架构:软件设计架构

    MVC:开发模式 jsp演变历史 早期只有servlet,只能使用response输出标签数据,非常麻烦 后来又jsp,简化了Servlet的开发,如果过度使用jsp,在jsp中即写大量的java代码 ...