背景
基於 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軸。