Paimon Branch --- 流批一体化之二

Branch是什么?

可以理解为是git的分支,分为主分支、dev分支等等,而最后读取的时候就相当于是分支的一个merge合并

在流式数据处理中,数据可能因为乱序等问题,存在不准确的情况,这是实时的通病,而实时修正数据存在困难,那么为了解决这个补数的情况,因此Paimon推出了Branch分支机制。

假设现有工作流处理的分支为"主分支",通过创建自定义数据分支,可在不停止现有读写工作流且无需复制主分支数据的前提下,对现有表进行新任务的实验测试与数据验证。

借助合并或替换分支操作,即可完成数据修正工作。

(1) Branch的创建和删除

首先需要创建branch,Paimon支持从特定标签创建分支,或直接创建空分支------这意味着创建的分支初始状态如同空白表格。

sql 复制代码
-- 从tag1中对table1创建test-branch分支
CALL sys.create_branch('default.table1', 'test-branch', 'tag1');

-- 直接对table2创建一个空的tese-branch2分支
CALL sys.create_branch('default.table2', 'test-branch2');

-- 删除指定branch
CALL sys.delete_branch('default.table3', 'branch1');

(2) Branch的使用 -- 读写

默认Branch分支是main,并且Branch有默认的前缀是branch_

因此,如果我们想读写特定的Branch,有2种方式

<1> 方式一:sql就指定好,读写那个Branch

sql 复制代码
-- 对表t从Branch为test-branch去读数据
SELECT * FROM `t$branch_test-branch`; -- 批
SELECT * FROM `t$branch_test-branch` /*+ OPTIONS('consumer-id' = 'myid') */; -- 流

-- 往表t的test2分支去写
INSERT INTO `t$branch_test2` 
SELECT ...

<2> 方式二:采用Fallback Branch -- 流批一体之二

这个原理就是:设置为fallback分支后, 当查询/写入的分区在主分支不存在时,paimon reader会从scan.fallback-branch指定的分支去进行操作

因此,就可以针对流批一体做一些操作,比如离线的批数据正常写入到昨日的分区中,而实时数据写到今日的Fallback Branch分支的分区中

案例如下:

sql 复制代码
-- 1.创建一个T表,按照dt分区
CREATE TABLE T (
    dt STRING NOT NULL,
    name STRING NOT NULL,
    amount BIGINT
) PARTITIONED BY (dt);

-- 2.为流处理创建一个Branch,叫test
CALL sys.create_branch('default.T', 'test');

-- 3.对test分支进行修改属性
ALTER TABLE `T$branch_test` SET (
    'primary-key' = 'dt,name',
    'bucket' = '2',
    'changelog-producer' = 'lookup'
);

-- 4.设置Fallback Branch 为 test分支
ALTER TABLE T SET (
    'scan.fallback-branch' = 'test'
);

-- 5.流式写入,写入到T表的test分支的20240726分区中
(这里如果全部都是20250726分区的数据,那么也可以不写$branch_test,因为T表是没有20240726分区的,会去Fallback Branch分支中操作,但是建议是带上$branch_test)
INSERT INTO `T$branch_test` VALUES ('20240725', 'apple', 4), ('20240725', 'peach', 10), ('20240726', 'cherry', 3), ('20240726', 'pear', 6);

-- 6.批式写入T的主分支
INSERT INTO T VALUES ('20240725', 'apple', 5), ('20240725', 'banana', 7);

-- 7.查表的时候,引擎会合并Branch分支的数据,因此查询,是能查到20240726分区的数据的
-- 合并的逻辑是main没有的分区,从Fallback Branch中拿数据,main有的分区,从main拿
SELECT * FROM T;
/*
+------------------+------------------+--------+
|               dt |             name | amount |
+------------------+------------------+--------+
|         20240725 |            apple |      5 |
|         20240725 |           banana |      7 |
|         20240726 |           cherry |      3 |
|         20240726 |             pear |      6 |
+------------------+------------------+--------+
*/

-- 重置fallback branch
ALTER TABLE T RESET ( 'scan.fallback-branch' );

-- 这样读的话,就只能读main主分支的数据了
SELECT * FROM T;
/*
+------------------+------------------+--------+
|               dt |             name | amount |
+------------------+------------------+--------+
|         20240725 |            apple |      5 |
|         20240725 |           banana |      7 |
+------------------+------------------+--------+
*/

(3) 总结

针对实时数据不准确,需要补数,修改的操作,传统做法是离线覆盖实时昨日,分别落两个表,维护两套系统,这对开发而已是很浪费资源的问题,因此,Paimon推出了Branch操作,去实现一套sql一张表,不同的Branch去存实时和离线的数据,互相不影响,查询的时候又能既查出实时的,也查出离线的

方案就是:

  1. 离线跑main主分支,直接insert overwrite/into
  2. 实时的跑Fallback Branch指定分支,只能insert into
  3. 查询时,Paimon reader会去合并:优先读取主分支(main)的分区数据;如果 main 分支没有该分区,才从 Fallback Branch 读取该分区的补充数据
相关推荐
Promise微笑3 小时前
2026年国产替代油介损测试仪:油介损全场景解决方案与技术演进
大数据·网络·人工智能
workflower3 小时前
具身智能行业应用-生活服务业
大数据·人工智能·机器人·动态规划·生活
前端一小卒3 小时前
我用 Claude Code 的 Superpowers 技能链写了个服务,部署前差点把服务器搞炸
前端·javascript·后端
志栋智能4 小时前
超自动化安全:构建智能安全运营的核心引擎
大数据·运维·服务器·数据库·安全·自动化·产品运营
xiaoduo AI5 小时前
客服机器人非工作时间能休眠?智能Agent开放平台定时唤醒,无人值守省资源?
大数据·人工智能·机器人
曹牧5 小时前
Spring:@RequestMapping注解,匹配的顺序与上下文无关
java·后端·spring
好赞科技5 小时前
深度测评2026年精选美发预约小程序排行榜 革新预约新体验 修订
大数据·微信小程序
阿丰资源6 小时前
SpringBoot+Vue实战:打造企业级在线文档管理系统
vue.js·spring boot·后端
Rust研习社6 小时前
使用 Axum 构建高性能异步 Web 服务
开发语言·前端·网络·后端·http·rust
0xDevNull6 小时前
Spring Boot 自动装配:从原理到实践
java·spring boot·后端