Flink DataStream之Union合并流

本文详细介绍了如何在Flink DataStream API中使用Union操作合并多个数据流,通过两种不同的实现方式,包括步骤和示例代码,展示了如何在大数据处理场景下整合流数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 新建类
package test01;

import jdk.nashorn.internal.runtime.regexp.joni.Config;
import org.apache.flink.api.java.ExecutionEnvironment;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;

public class TestUnion {

    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment executionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment(new Configuration());
        executionEnvironment.setParallelism(1);

        //Union合并流的流数据类型必须一致,如果不一致,需要在合并前先转换类型,使其一致

        //创建要合并的流
        DataStreamSource<String>
### 使用 Hudi 和 Flink 进行数据合并或联合操作 在 Apache Flink 中使用 Hudi 实现数据的合并(merge)或联合(union)操作,可以通过定义不同的表结构并利用 SQL 或 DataStream API 来完成。以下是实现这一目标的具体方法: #### 表结构设计 为了演示如何进行数据合并或联合操作,假设我们有两个表 `t1` 和 `t2`,它们具有相同的 schema 结构。这两个表的数据可能来自不同分区或者不同的时间戳范围。 ```sql CREATE TABLE t1 ( uuid VARCHAR(20) PRIMARY KEY NOT ENFORCED, name VARCHAR(10), age INT, ts TIMESTAMP(3), partition_col VARCHAR(20) ) PARTITIONED BY (partition_col) WITH ( 'connector' = 'hudi', 'path' = 'hdfs://chb3:8020/hudi_db/t1', 'table.type' = 'MERGE_ON_READ' ); CREATE TABLE t2 ( uuid VARCHAR(20) PRIMARY KEY NOT ENFORCED, name VARCHAR(10), age INT, ts TIMESTAMP(3), partition_col VARCHAR(20) ) PARTIONED BY (partition_col) WITH ( 'connector' = 'hudi', 'path' = 'hdfs://chb3:8020/hudi_db/t2', 'table.type' = 'COPY_ON_WRITE' ); ``` 以上两个表分别基于 Hudi 的两种模式:`MERGE_ON_READ` 和 `COPY_ON_WRITE`[^1]。 --- #### 数据插入 向两张表中插入一些初始数据以便后续的操作。 ```sql INSERT INTO t1 VALUES ('id1', 'Alice', 25, TIMESTAMP '2023-01-01 00:00:01', 'part1'), ('id2', 'Bob', 30, TIMESTAMP '2023-01-01 00:00:02', 'part1'); INSERT INTO t2 VALUES ('id3', 'Charlie', 35, TIMESTAMP '2023-01-01 00:00:03', 'part2'), ('id4', 'David', 40, TIMESTAMP '2023-01-01 00:00:04', 'part2'); ``` --- #### 联合操作(Union) 如果希望将两份数据简单地拼接在一起而不考虑重复记录,则可以直接执行 UNION ALL 操作。 ```sql SELECT * FROM t1 UNION ALL SELECT * FROM t2; ``` 此查询会返回所有属于 `t1` 和 `t2` 的记录集合,不剔除任何重复项。 --- #### 合并操作(Merge) 当需要处理重复键的情况时,可以采用 MERGE INTO 语句来更新已有记录或将新记录插入到目标表中。 ```sql -- 创建一个新的目标表用于保存最终结果 CREATE TABLE merged_table ( uuid VARCHAR(20) PRIMARY KEY NOT ENFORCED, name VARCHAR(10), age INT, ts TIMESTAMP(3), partition_col VARCHAR(20) ) PARTITIONED BY (partition_col) WITH ( 'connector' = 'hudi', 'path' = 'hdfs://chb3:8020/hudi_db/merged_table', 'table.type' = 'MERGE_ON_READ' ); -- 执行 merge into 操作 MERGE INTO merged_table AS target USING ( SELECT * FROM t1 UNION ALL SELECT * FROM t2 ) AS source ON target.uuid = source.uuid WHEN MATCHED THEN UPDATE SET * WHEN NOT MATCHED THEN INSERT *; ``` 在此过程中,对于匹配上的 UUID 记录将会被更新;而对于未找到对应关系的新记录则会被插入至目标表中。 注意,在实际部署环境中还需要配置 checkpoint 参数以确保事务一致性以及设置 write rate limit 防止因过高并发引发性能瓶颈问题[^2][^3]。 --- ### 性能优化建议 - **启用 Checkpoint**: 确保 Flink 应用程序启用了 checkpoint 功能,并调整合适的间隔频率。 - **限流控制**: 如果源端存在大量突发流量输入场景下可适当调大 `write.rate.limit` 值减少资源争抢现象发生概率。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

QYHuiiQ

听说打赏的人工资翻倍~

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

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

打赏作者

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

抵扣说明:

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

余额充值