flink kafka 实现如下功能

本文展示了如何利用Flink从Kafka topic中读取订单数据,并通过SQL实现数据处理,包括按ord_id去重保留最新记录,以及基于时间窗口的聚合计算,最后将结果写入指定表。

1 )一个kafka的topic order
{“ord_id”:“1”,“city_id”:“300100”,“submit_time”:“2021-11-25 11:32:24”,“total_fee”:25}
{“ord_id”:“1”,“city_id”:“300100”,“submit_time”:“2021-11-25 11:32:55”,“total_fee”:25}
{“ord_id”:“1”,“city_id”:“300100”,“submit_time”:“2021-11-25 11:35:14”,“total_fee”:25}
{“ord_id”:“2”,“city_id”:“300100”,“submit_time”:“2021-11-25 11:36:51”,“total_fee”:48}
{“ord_id”:“2”,“city_id”:“300100”,“submit_time”:“2021-11-25 11:37:55”,“total_fee”:48}
{“ord_id”:“3”,“city_id”:“300200”,“submit_time”:“2021-11-25 11:38:57”,“total_fee”:35}

2)按key取最新1条后的结果集 order_unique_view
select * from order_unique_view
;
ord_id city_id submit_time total_fee
1 300100 2021-11-25 11:35:14 25
2 300100 2021-11-25 11:37:55 48
3 300200 2021-11-25 11:38:57 35

<
在 Apache Flink 的实时流处理中,实现 Kafka 中三张表的关联操作,通常涉及将 Kafka 主题中的数据映射为动态表(Dynamic Table),并通过 Flink SQL 或者 Table API 来完成多表之间的连接。这种场景下,Kafka 数据源通常来自于数据库的变更日志(例如 Oracle、MySQL 的 DML 操作记录)[^3],通过 Kafka Connector 将这些变更事件写入 Kafka 不同的主题中。 以下是一个典型的实现流程: ### 1. 使用 Kafka Connector 映射 Kafka 主题为表 Flink 提供了 Kafka Connector,可以将 Kafka 的主题映射为 Flink 表结构。假设 Kafka 中有三个主题分别对应三张表 `orders`, `customers`, 和 `products`,可以通过如下语句创建表: ```sql CREATE TABLE orders ( order_id STRING, customer_id STRING, product_id STRING, order_time TIMESTAMP(3), WATERMARK FOR order_time AS order_time - INTERVAL '5' SECOND ) WITH ( 'connector' = 'kafka', 'topic' = 'orders-topic', 'properties.bootstrap.servers' = 'localhost:9092', 'format' = 'json' ); ``` 对 `customers` 和 `products` 表做类似的操作即可,只需要更改字段和主题名称。 ### 2. 实现多表 JOIN 操作 在 Flink SQL 中支持多种类型的 JOIN,包括 `INNER JOIN`、`LEFT JOIN`、`TEMPORAL JOIN` 等,适用于不同的业务场景。 #### 示例:基于时间窗口的 INNER JOIN ```sql SELECT o.order_id, c.customer_name, p.product_name, o.order_time FROM orders AS o INNER JOIN customers FOR SYSTEM_TIME AS OF o.proc_time AS c ON o.customer_id = c.customer_id INNER JOIN products FOR SYSTEM_TIME AS OF o.proc_time AS p ON o.product_id = p.product_id; ``` 上述查询使用了 `FOR SYSTEM_TIME AS OF` 子句进行 Temporal Join,表示从维度表中获取某一时刻的有效记录。这种方式非常适合处理 Kafka 中的变更日志流,特别是当维度表使用 Upsert Kafka Connector 创建时,能够保证查询结果与源表保持一致 [^2]。 ### 3. 使用 Upsert Kafka Connector 同步更新数据 为了确保维度表(如 `customers` 和 `products`)能反映最新的状态,可以使用 `upsert-kafka` connector 创建动态表: ```sql CREATE TABLE customers ( customer_id STRING PRIMARY KEY, customer_name STRING ) WITH ( 'connector' = 'upsert-kafka', 'topic' = 'customers-topic', 'properties.bootstrap.servers' = 'localhost:9092', 'key.format' = 'json', 'value.format' = 'json' ); ``` 通过这种方式,Flink 可以自动处理 Kafka 中的更新和删除操作,并在执行 JOIN 时提供最新的数据版本 [^2]。 ### 4. 设置 Watermark 和时间属性 为了支持事件时间语义和窗口操作,需要在主表(如 `orders`)中定义 watermark 和时间字段。这有助于控制延迟事件并提高窗口聚合的准确性 [^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

科学的N次方

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值