我的用例- 收集特定时间段内的事件,然后根据密钥对其进行分组
目标 处理后,用户可以根据密钥保存特定持续时间的数据
我打算如何做 1)从卡夫卡接收事件
2)创建事件数据流
3)通过运行SQL查询将表与表关联并收集特定时间段的数据
4)将新表与步骤2的输出相关联,并根据键对收集的数据进行分组
5)将数据保存在数据库中
我尝试过的解决方案-
我能够-
1)从卡夫卡接收事件,
2)设置数据流(例如sensorDataStream)-
DataStream<SensorEvent> sensorDataStream
= source.flatMap(new FlatMapFunction<String, SensorEvent>() {
@Override
public void flatMap(String catalog, Collector<SensorEvent> out) {
// create SensorEvent(id, sensor notification value, notification time) creation
});
3)将一个表(比如说table1)与数据流相关联,并在运行SQL查询(如-
之后)SELECT id, sensorNotif, notifTime FROM SENSORTABLE WHERE notifTime > t1_Timestamp AND notifTime < t2_Timestamp.
此处t1_Timestamp和t2_Timestamp是预定义的纪元时间,并将根据某些预定义的条件而变化
4)我可以通过在控制台上使用以下查询来打印此sql查询结果-
tableEnv.toAppendStream(table1, Row.class).print();
5)通过使用table1和以下类型的sql查询创建一个新表(比如说table2)-
Table table2 = tableEnv.sqlQuery("SELECT id AS SensorID, COUNT(sensorNotif) AS SensorNotificationCount FROM table1 GROUP BY id);
6)使用-
收集和打印数据tableEnv.toRetractStream(table2 , Row.class).print();
问题
1)我在控制台上看不到步骤6的输出。
我做了一些实验,发现如果我跳过table1的设置步骤(这意味着在一段时间内没有传感器数据合并),并且直接将我的sensorrDataStream与table2关联,那么我可以看到步骤6的输出,但是因为这是RetractStream,所以我可以以的形式查看数据,如果有新事件发生,则此撤回流将使数据无效并打印新计算的数据。
我想要的建议
1)我如何合并第5步和第6步(表示table1和table2)。我已经合并了这些表,但是由于数据在控制台上不可见,所以我有疑问吗?难道我做错了什么?还是数据已合并但不可见?
2)我的计划是-
2.a)两次过滤数据,在特定时间间隔的第一遍过滤数据中,在第二遍组中过滤该数据
2.b)将2.a输出保存到DB中 这种方法行得通吗(我有疑问,因为我正在使用数据流,而输出的table1是追加流,而table2的输出是收回流)?