开发者社区> 问答> 正文

flink sql 如何实现判断连接数据

环境说明: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如何实现?
QQ截图20230823135916.png

展开
收起
游客fuzojzpl5x2bu 2023-08-23 14:03:16 127 0
1 条回答
写回答
取消 提交回答
  • 要使用Flink SQL实现对连续的异常告警进行合并,您可以按照以下步骤进行操作:

    1. 创建一个Kafka数据源表:使用Flink SQL的CREATE TABLE语句创建一个Kafka数据源表,指定相关的连接信息和格式化选项。

    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'
    );

    1. 创建一个MySQL结果表:使用Flink SQL的CREATE TABLE语句创建一个MySQL结果表,用于将处理后的结果数据写入到MySQL中。根据您的需求,定义适当的列和数据类型。

    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'
    );

    1. 编写Flink SQL查询:使用Flink SQL编写查询语句,通过窗口函数和GROUP BY来实现对连续异常告警的合并。

    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结果表中。

    1. 提交Flink SQL作业:在Flink集群上提交您编写的Flink SQL查询作业。根据您的环境,可以使用Flink的命令行工具或Web界面来提交作业。
    2023-08-24 08:48:31
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Flink CDC Meetup PPT - 龚中强 立即下载
Flink CDC Meetup PPT - 王赫 立即下载
Flink CDC Meetup PPT - 覃立辉 立即下载