8.8. 案例实战:SQL on IoT#
经过本章的学习,结合三到七章的背景知识,读者应该对 Table API & SQL 有了比较全面的了解,尤其 SQL 提供了一种更为通用的接口,相比 Java/Scala 来说更方便易用。本节将结合物联网(Internet of Things,IoT)场景来展示如何使用 Flink SQL 进行数据处理和分析。
实验目的#
熟悉 Flink SQL 的各类操作:包括使用 Flink SQL 连接数据源,进行时间窗口操作,进行两个表的 Temporal Table Join 等。
实验内容#
本实验基于德国纽伦堡大学提供的室内气候数据 [1],该团队使用 IoT 设备来收集温度、湿度、光照等数据,结合室内人数、人物活动以及门窗开闭等情况,进行了研究,我们在原始数据基础上做了调整。
假设我们有多个房间(A、B、C 等),每个房间内部署有传感器,传感器可以收集温度、相对湿度、光照等数据。图 8.19 展示了房间 A 的布局,其中 A1 至 A4 为传感器。
传感器收集上来的数据集名为 sensor.csv
,包括以下字段:room,node_id,temp,humidity,light,ts
,各字段含义如下:
room
:房间号,这里为 A、B、C 等。node_id
:该房间内的传感器编号,以上图中的房间 A 为例,共 4 个传感器,编号为 1 至 4。temp
:摄氏温度,单位°C。humidity
:相对湿度,单位 %。light
:光传感器波长,单位 nm。ts
:数据收集时间戳,形如2016-03-15 19:34:05
。
此外,第二个数据流收集房间的环境信息,数据集名为 env.csv
。这个数据记录了房间环境的变动,任何变动都将在数据中增加一条记录。数据包括以下字段:room,occupant,activity,door,win,ts
,各字段含义如下:
room
:房间号,这里为 A、B、C 等。occupant
:房间人数。activity
:人物行为。0:无活动、1:读、2:站、3:行走、4:工作。door
:门的状态。0:关、1:开。win
:窗的状态,0:关、1:开。ts
:以上环境信息发生改动的时间戳,形如2016-03-15 19:34:05
。
两份数据集在工程目录的 src/main/resources/iot
下。
实验内容#
结合本书内容和 Flink 官方文档,完成下面程序:
程序 1:使用流处理模式,读取
sensor.csv
和env.csv
数据源,注意ts
字段作为时间属性,并定义 Watermark 策略。程序 2:按房间号分组,计算该房间内每分钟的平均温度和湿度,输出到文件系统上。
程序 3:基于 Temporal Table Join,将
sensor.csv
和env.csv
按照房间号连接,生成一个宽表(宽表有助于哦后续数据分析流程),将结果输出到文件系统上。宽表包括以下字段:room,node_id,temp,humidity,light,occupant,activity,door,win,ts
。
实验报告#
将思路和程序撰写成实验报告。