环境说明:flink 1.15 on yarn 模式
计算逻辑说明:从kafka消费数据,然后处理,结果数据写入到mysql。
来源数据说明:
第一列为告警名称,第二无为告警时间,第三列为告警状态
示例数据:
A告警 9:01 异常
A告警 9:02 异常
A告警 9:03 异常
A告警 9:04 正常
A告警 9:05 正常
A告警 9:06 正常
A告警 9:07 异常
A告警 9:08 异常
A告警 9:09 正常
B告警 9:02 异常
B告警 9:03 异常
B告警 9:04 正常
B告警 9:07 异常
B告警 9:08 异常
当一个告警发生时,会连续发送数据过来(告警状态=异常),当告警消失会发送正常数据过来(告警状态=正常)。
计算结果如下图红框中的数据要算成同一个告警,连续的同一个异常告警要合并成一条数据。请问用flink sql如何实现?
要使用Flink SQL实现对连续的异常告警进行合并,您可以按照以下步骤进行操作:
sql
CREATE TABLE kafka_source (
alarm_name STRING,
alarm_time STRING,
alarm_status STRING
) WITH (
'connector' = 'kafka',
'topic' = 'your_topic',
'properties.bootstrap.servers' = 'your_bootstrap_servers',
'format' = 'csv'
);
sql
CREATE TABLE mysql_result (
alarm_name STRING,
start_time STRING,
end_time STRING,
duration INT
) WITH (
'connector' = 'jdbc',
'url' = 'jdbc:mysql://your_mysql_host:your_mysql_port/your_database',
'table-name' = 'your_table',
'username' = 'your_username',
'password' = 'your_password'
);
sql
INSERT INTO mysql_result
SELECT alarm_name, MIN(alarm_time) AS start_time, MAX(alarm_time) AS end_time, COUNT(*) AS duration
FROM (
SELECT alarm_name, alarm_time, alarm_status, SUM(is_change) OVER (PARTITION BY alarm_name ORDER BY alarm_time) AS group_id
FROM (
SELECT alarm_name, alarm_time, alarm_status,
CASE WHEN LAG(alarm_status, 1) OVER (PARTITION BY alarm_name ORDER BY alarm_time) = alarm_status THEN 0 ELSE 1 END AS is_change
FROM kafka_source
)
)
WHERE alarm_status = '异常'
GROUP BY alarm_id;
上述查询中,首先使用LAG函数判断前一条数据与当前数据的告警状态是否相同,如果不同,则标记为is_change=1。然后使用SUM函数和窗口函数对is_change列进行累加,得到一个group_id,用于将连续的异常告警分组。最后根据alarm_name和group_id进行分组,计算每个分组的最早开始时间、最晚结束时间和持续时间,并插入到MySQL结果表中。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。