Flink Sql on Zeppelin(4)——聚合结果写入Kafka

聚合结果写入Kafka

概述

  • 大家在使用Flink Sql,并将聚合数据写入Kafka的时候,肯定遇到过这样的报错
    Exception in thread "main" org.apache.flink.table.api.TableException: AppendStreamTableSink requires that Table has only insert changes.
    at org.apache.flink.table.planner.plan.nodes.physical.stream.StreamExecSink.translateToPlanInternal(StreamExecSink.scala:123)
    at org.apache.flink.table.planner.plan.nodes.physical.stream.StreamExecSink.translateToPlanInternal(StreamExecSink.scala:48)
    at org.apache.flink.table.planner.plan.nodes.exec.ExecNode$class.translateToPlan(ExecNode.scala:58)
    at org.apache.flink.table.planner.plan.nodes.physical.stream.StreamExecSink.translateToPlan(StreamExecSink.scala:48)
    at org.apache.flink.table.planner.delegation.Stream
### 如何使用 Flink SQL 将处理结果写入 Kafka 主题 在 Apache Flink 的生态系统中,可以通过 `UPSERT KAFKA` 连接器以及标准的 `INSERT INTO` 语句来实现将数据写入 Kafka 主题的功能。以下是具体方法及相关配置说明: #### 配置 UPSERT KAFKA 连接器 为了支持以 `upsert` 方式向 Kafka 写入数据,需定义一个目标表并指定其连接器类型为 `upsert-kafka`。此过程涉及多个参数设置,例如主题名称、格式化方式等。 ```sql CREATE TABLE kafka_output_table ( id BIGINT, name STRING, age INT, PRIMARY KEY (id) NOT ENFORCED -- 定义主键字段用于识别更新操作 ) WITH ( 'connector' = 'upsert-kafka', -- 使用 upsert-kafka 连接器[^1] 'topic' = 'output_topic', -- 指定要写入的目标 Kafka 主题 'properties.bootstrap.servers' = 'localhost:9092', 'key.format' = 'json', -- 键值序列化的格式 'value.format' = 'json' -- 值序列化的格式[^2] ); ``` 上述代码片段展示了如何创建一张基于 Kafka 输出的主题表。其中 `'value.format'` 参数指定了消息体的数据格式可以是 JSON 或其他形式。 #### 插入数据到 Kafka 表 一旦完成目标表的定义,就可以利用简单的 SQL 查询语法执行插入动作。这一步骤会触发计算逻辑并将最终的结果集推送到指定的 Kafka 主题上。 ```sql INSERT INTO kafka_output_table SELECT user_id, username, user_age FROM source_table; ``` 这里假设存在另一个名为 `source_table` 的输入源表,它可能同样来源于某个 Kafka 主题或其他外部系统。通过该命令可实现实时流式传输至下游服务端点。 对于更复杂的场景比如需要支持全量变更日志(CDC),则还需要调整默认行为以便能够正确反映删除记录或者前镜像状态变化的情况。此时可通过修改底层框架中的特定组件达成目的[^4]。 #### 示例:自定义变更日志模式 如果遇到某些特殊情况无法满足内置机制的要求,则允许开发者自行扩展插件功能。下面给出了一种解决方案概述——即重载现有类结构从而增强对其增删改事件的支持程度。 ```java @Override public ChangelogMode getChangelogMode(){ return ChangelogMode.newBuilder() .addContainedKind(RowKind.INSERT) .addContainedKind(RowKind.UPDATE_AFTER) .addContainedKind(RowKind.UPDATE_BEFORE) .addContainedKind(RowKind.DELETE).build(); } ``` 以上 Java 片段演示了怎样定制化生成完整的变更历史记录集合。经过此类改造之后再重新编译部署项目即可生效。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值