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 读取该分区的补充数据
相关推荐
BIBI204911 分钟前
Windows 上配置 Nacos Server 3.x.x 使用 MySQL 5.7
java·windows·spring boot·后端·mysql·nacos·配置
IT_陈寒17 分钟前
Redis高频踩坑实录:5个不报错但会导致性能腰斩的'隐秘'配置项
前端·人工智能·后端
CoolerWu20 分钟前
2025 · 我与 AI / Vibe Coding 的一年
前端·后端
不思念一个荒废的名字21 分钟前
【黑马JavaWeb+AI知识梳理】Web后端开发06 - SpringBoot原理篇
spring boot·后端
AC赳赳老秦24 分钟前
DeepSeek-Coder vs Copilot:嵌入式开发场景适配性对比实战
java·前端·后端·struts·mongodb·copilot·deepseek
一只专注api接口开发的技术猿28 分钟前
智能决策数据源:利用 1688 商品详情 API 构建实时比价与供应链分析系统
大数据·前端·数据库
9号达人37 分钟前
支付配置时好时坏?异步方法里的对象引用坑
java·后端·面试
CES_Asia38 分钟前
2026科技热点预言:CES Asia“具身智能”展区已成产业风向标
大数据·人工智能·科技·机器人
风跟我说过她40 分钟前
HBase完全分布式部署详细教程(含HA高可用版+普通非HA版)
大数据·数据库·分布式·centos·hbase
神算大模型APi--天枢6461 小时前
合规落地加速期,大模型后端开发与部署的实战指南
大数据·前端·人工智能·架构·硬件架构