Home

Calcite笔记之五:SQL解析

C 代码编译时要经过词法分析、语法分析:比如提取关键字(int/for/#define, ETC.),判断语法是否正确。 类似的,SQL 字符串解析为SqlNode也需要词法分析。 在 Calcite 中,这一过程借助于 javacc 完成。预配置的语法文件里,包含了需要的关键字以及对应的代码模板。随着解析字符串匹配到关键字,一步步生成需要的代码。 这篇笔记主要记录 javacc 以及 Calcite 里对应的源码分析。 1. javacc javacc1是一个 java 版本的语法解析库,我们可以用来定义自己的关键字,生成 java 代码。 举个例子,我们定义一个自解释的Explain关键字,输入形如: EXPLAIN javacc; 预期的输出是打印参数(java...

Read more

愿我们都在黑底白字中读懂自己-读《麦肯锡精英高效阅读法》

这几年,陆续开始看一些时间管理、工作方法、职场进阶类的书籍,其中像《单核工作法》印象最深,因为可操作性比较强。 也有很多书,反复陈述一个论调不断灌输,难免变成心灵鸡汤文。虽然每一句话都有道理,但是毕竟我们很难对书里的每一句话都做到感同身受、深入思考,因此收获反而很少。 读完《麦肯锡精英高效阅读法》,有一些共鸣,反思了自己读书时的一些坏习惯。合上书后,还能清楚的记得整本书作者的思路。 因此,我觉得这是一本好书。 1. 无法读书的理由 忙于工作,没时间读书 不知应该读什么 没读完的书不断增多 工作繁忙,不知是否应该读书 无法专注地读书 感触比较大的是 2,或者是说在其他几个理由的背景下,特别想读到一本“合适”的书。比如我有时候想去看但是不知道看哪本书: ...

Read more

青梅煮酒论英雄-读《李光耀观天下》

这本书评价了中、美、欧洲、日朝韩、印度、东南亚、新加坡、中东等多个国家和地区,读着有一种青梅煮酒论英雄的感觉。 不知道世界上对李光耀中肯的评价是什么,我读完这本书后,第一印象是「一个思路清晰的实用主义者」。 整本书读下来,给人的感觉是思路清晰:在历史背景下的新加坡的定位、发展策略。 一个小细节可以看出实用主义,当有人问李光耀习惯读的书时,他是这么回答的: 我平时爱看有意思的人物传记。小说对我毫无吸引力,都是虚构的东西,或者是重建人们想象中的美好人生。 1. 外国人眼里的中国 毫无疑问,新中国取得的成绩在整个世界都是耀眼的。经济、人民的生活水平、国力都飞速发展。书里没有比较多的数字举例,但是对于改革开放的成绩,都充满了赞叹。 同时,这本书也足够客观,既肯定了成绩,也...

Read more

Calcite笔记之四:代码生成与编译

1. Csv表 之前记录了 Calcite 的架构和简化后的代码流程,这篇笔记回归下最开始Tutorial笔记里的 Csv 表,仿照写了一个可以 Debug 的例子(TutorialTest.scala): val csvPath = getClass.getClassLoader.getResource("sales_from_calcite_sources").getPath // val csvSchema = new CsvSchema(new File(csvPath), CsvTable.Flavor.SCANNABLE) val csvSchema = new CsvSchema(new File(csvPath), CsvTable.Flavor.TRAN...

Read more

Calcite笔记之三:处理流程的代码例子

单纯看Caclite 架构理解不深,这篇笔记通过代码示例补充下处理流程:Parser、Valiator、SqlToRelConverter 等。 实现主要参考了1和源码单测里的CsvTest,使用 Book & Author 表,查询 SQL 跟关系代数里基本一致以方便前后对比,完整的代码可以参考CalciteProcessSteps.scala 1. SqlParser val query = """SELECT b.id, | b.title, | b.publish_year, | a.fname, | a.lname |FROM ...

Read more

Calcite笔记之二:关系代数、架构与处理流程

了解关系代数有助于从逻辑或者各类名词上理解 Calciate,惭愧的是我只记得学过高等代数、抽象代数,好在看了下影响不大,其实从使用关系数据库的时候就已经潜移默化的有这些概念了。 1. Relational Algebra Relational algebra is at the heart of Calcite. 关系代数是跟 SQL 一一对应的,一条 SQL 查询语句,可以转换为一个由关系运算符组成的树。这么说可能有些读者没有准确的概念,举两个例子说明: 比如上一篇笔记里的 SQL: SELECT name FROM EMPS WHERE EMPNO = 1 转化成关系代数: π name σ empno = 1 emps 图形化的结果: 其中 ...

Read more

Calcite笔记之一:Tutorial

最开始了解 Calcite 的时候,印象最深的是众多名词。而由于 Calcite 的定位,其应用方式又多种多样,所以有一种以为看懂了,却还是不知道如何应用的感觉。这篇笔记,记录下我对 Calcite 的理解。 1. 背景 2005年,Michael Stonebraker 发表了“One size fits all” is an idea whose time has come and gone,即传统关系型数据库一招吃遍天的时代过去了。 事实证明确实如此,随着数据量的增长,各种数据库层出不穷,各有所长。除非硬件突破,短时间内我们也很难看到一统江湖(One size fits all)的局面。 2015年,Julian Hyde 在 XLDB 上做了一次演讲,题为Apache ...

Read more

数据湖笔记之一:Z-Order

Z-order curve,1966年就已经在应用了。但是在大数据崭露头角,似乎才是这几年的事情。最近看了数据湖的一些技术,想从细处着手,介绍下我理解的 Z-Order. 1. 背景 Z-Order 在地图的场景中应用非常常见,比如查找地图上某个点附近的信息。 假定我们的地图数据里有 N 个点,记录了对应的位置坐标(经纬度)、id、名称、信息等,要查找当前坐标附近 10 公里内的餐馆。最朴素的想法就是计算所有餐馆跟当前位置的距离,过滤 <= 10 公里的结果。不过数据量大肯定不行,太多的冗余计算了。 按照我的理解,坐标轴天然是递增的,所以二分法是一个不错的解决方案:如果在一维世界(x维度),创建一个 x->id 的辅助数组,性能足够。类比到二维世界(x、y维度),通...

Read more