今天要与你分享的主题是“从 SQL 到 Streaming SQL:突破静态数据查询的次元”。
在前面的章节中,我们介绍了一些流数据处理相关的知识和技术,比如 Apache Spark 的流处理模块——Spark Streaming 和 Structured Streaming,以及 Apache Beam 中的窗口处理。相信你对流处理的重要性和一些基本手段都有所了解了。
流处理之所以重要,是因为现在是个数据爆炸的时代,大部分数据源是每时每刻都在更新的,数据处理系统对时效性的要求都很高。作为当代和未来的数据处理架构师,我们势必要深刻掌握流数据处理的技能。
“批”“流”两手抓,两手都要硬。
你还记得,在第 15 讲中介绍过的 Spark SQL 吗?它最大的优点就是 DataFrame/DataSet 是高级 API,提供类似于 SQL 的 query 接口,方便熟悉关系型数据库的开发人员使用。
当说到批处理的时候,我们第一个想到的工具就是 SQL,因为基本上每个数据从业者都懂,而且它的语法简单易懂,方便使用。那么,你也能很自然地联想到,如果在流处理的世界中也可以用 SQL,或者相似的语言,那真是太棒了。
这样的思想在第 17 讲中我们曾经提到过。
Spark 的 Structured Streaming 就是用支持类 SQL 的 DataFrame API 去做流处理的。支持用类似于 SQL 处理流数据的平台还有很多,比如 Flink、Storm 等,但它们是把 SQL 做成 API 和其他的处理逻辑结合在一起,并没有把它单独分离成一种语言,为它定义语法。
那么,到底有没有类似 SQL 语法来对流数据进行查询的语言呢?答案是肯定的。我们把这种语言统称为 Streaming SQL。Siddhi Streaming SQL 和 Kafka KSQL 就是两个典型的 Streaming SQL 语言,下文的例子我们主要用这两种语言来描述。
不同于 SQL,Streaming SQL 并没有统一的语法规范,不同平台提供的 Streaming SQL 语法都有所不同。而且 Streaming SQL 作用的数据对象也不是有界的数据表,而是无边界的数据流,你可以把它设想为一个底部一直在增加新数据的表。
SQL 是一个强大的、对有结构数据进行查询的语言,它提供几个独立的操作,如数据映射(SELECT