概述
结构化流是一种基于Spark SQL引擎的可扩展且容错的流处理引擎。他可以像表达静态数据的批处理计算一样表达流式计算。
快速示例
监听本地netcat服务器的输入内容 实时计算每个单词出现的次数在屏幕上打印
可以通过运行下载的Spark目录下的程序直接启动 再另外启动一个netcat服务器 再服务器终端输入内容即可在控制台看见相应的输出
编程模型
结构化流中的关键思想是将实时数据流视为连续追加的表。这使得新的流处理模型非常类似于批处理模型。您将流式计算表示为静态表上的标准批处理查询,Spark将其作为无界输入表上的增量查询运行。
基本概念
将输入数据流视为“输入表”。到达流的每个数据项都像一个新行被附加到输入表。
对输入的查询将生成“结果表”。每个触发间隔(例如,每1秒),新行将附加到输入表,最终更新结果表。每当结果表更新时,我们都希望将更改的结果行写入外部接收器。
Structured Streaming不会存储整个表,他只是从数据源逐渐取得数据,处理以更新结果,然后丢弃源数据。
使用数据集和数据资源的API
创建流式DataFrames和流式Datasets
输入源
有一些内置源。
- 文件来源。目录中写入的文件作为数据源
- Kafka来源。从Kafka读取源数据
- 套接字来源
- 速率源
流式 DataFrames/Datasets的操作
基本操作-查询 投影 聚合
case class DeviceData(device: String, deviceType: String, signal: Double, time: DateTime)
val df: DataFrame = ... // streaming DataFrame with IOT device data with schema { device: string, deviceType: string, signal: double, time: string }
val ds: Dataset[DeviceData] = df.as[DeviceData] // streaming Dataset with IOT device data
// Select the devices which have signal more than 10
df.select("device").where("signal > 10") // usin