Home

Flink - Row 里使用字符串的 ParseException

1. Row 里显式使用字符串的问题 在 20 年初最开始使用 Flink 1.9.1 时,有一些看似普通的 SQL 也会执行失败。比如下面这个: package cn.izualzhy import org.apache.flink.streaming.api.scala._ import org.apache.flink.table.api.bridge.scala.StreamTableEnvironment object LiteralInRowTest extends App { val env = StreamExecutionEnvironment.createLocalEnvironment(1) val tEnv = StreamTableEnviro...

Read more

Calcite-5:SQL解析

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

Read more

Calcite-4:代码生成与编译

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-3:处理流程的代码例子

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

Read more