使用Flink SQL API

时间:2019-07-17 18:43:09

标签: apache-flink flink-streaming flink-sql

我的用例- 收集特定时间段内的事件,然后根据密钥对其进行分组

目标 处理后,用户可以根据密钥保存特定持续时间的数据

我打算如何做 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的输出是收回流)?

0 个答案:

没有答案