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 读取该分区的补充数据
相关推荐
迷渡6 分钟前
用 Rust 重写的 Bun 有 13365 个 unsafe!
开发语言·后端·rust
ai_xiaogui10 分钟前
一人公司AI项目真实性如何验证?
大数据·aistarter·panelai·一人公司·ai项目验证·可落地的ai项目·本地ai部署工具
AI_大白11 分钟前
DeepSeek Function Calling 接入实时行情:从工具定义到多轮查询的完整示例
后端·架构
Sharewinfo_BJ14 分钟前
从手工报表到实时BI:一个零售数据平台的踩坑与重构实战
大数据·人工智能·科技·数据分析·微软·powerbi
Elastic 中国社区官方博客29 分钟前
在 Elasticsearch 中,存储向量查询速度最高提升 3 倍
大数据·人工智能·elasticsearch·搜索引擎·ai·全文检索
Cosolar31 分钟前
从零搭建本地 RAG 系统:LangChain + LM Studio 完整实战指南
人工智能·后端·面试
想ai抽36 分钟前
StarRocks 存储引擎设计深度调研笔记
大数据·starrocks·olap
云登指纹浏览器39 分钟前
2026静态IP和动态IP怎么选?跨境电商场景应用完整指南
大数据·网络协议·tcp/ip
vx153027823621 小时前
CDGA|企业数据治理中,AI权限该如何拿捏分寸
大数据·人工智能·cdga·数据治理
mCell1 小时前
可观测性实战:Prometheus + Grafana 全栈监控
运维·后端·google