背景
基于 Stream & Table relativity(参见前文),《Streaming Systems》将 declarative的编程方式往前推进到数据系统中最常用的SQL表达,即Streaming SQL。在《Streaming Systems》中,Streaming SQL 并不像 StreamCQL(基于Storm)属于 SQL-like,而是作为 Classic SQL 的扩展,兼容 Classic SQL 的所有规则。
目前而言,Streaming SQL 还是一个正在不断发展研究的的领域,还没有一个框架实现了《Streaming Systems》书中提到的所有扩展特性;在开源框架中,Apache Calcite 也只是实现了一部分(Apache Flink集成了Apache Calcite,Apache Spark 在2.2后也实现了部分特性)。
因此下面的讨论更多的是理论层面,而不是具体实现。
定义 Streaming SQL
关系型资料库,或者是 SQL-on-Hadoop 的 SQL 实现都算是 Classic SQL;它的数学基础是 relational algebra ,核心是 relation(a set of these tuples)。用传统资料库的辞汇表达就是一个 relation 就是一张 table、或者是资料库的物理单元 table、或者是 SQL 查询的 result、或者是 view 等等。relational algebra 的一个非常重要的性质就是 closure property:
applying any operator from the relational algebra to any valid relation always yields another relation.
许多尝试在 streaming 中引入 SQL 特性的系统都没有实现closure property(因此是 SQL-like );它们将 stream 和 SQL 视为不同的东西,并提供特殊的 operators 两者中转换。而这并不完美,使用者需要学习新的 operators,Streaming SQL 不应该这么复杂。
因此《Streaming Systems》将时间的概念或者说是 stream 的概念视为 relational algebra 的第一等公民,使 SQL 也能应用到 streaming 中。从这个角度看待 relation,Classic Relation 是 point-in-time relations ,而新的 relation 是 time-varying relations,即TVR。准确来讲,TVR 是evolution of a classic relation over time。
换句话说,Classic Relation 类似于二维的表结构,行代表著X轴,列代表著Y轴;time-varying relations在此基础之上引入了Z轴,即时间轴,变成了三维表结构。随著relation的变化,新的 relation snapshot 被不断加入Z轴。