惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
Schneier on Security
C
Cyber Attacks, Cyber Crime and Cyber Security
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Project Zero
Project Zero
T
The Exploit Database - CXSecurity.com
G
GRAHAM CLULEY
T
Threatpost
A
Arctic Wolf
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Scott Helme
Scott Helme
Simon Willison's Weblog
Simon Willison's Weblog
P
Proofpoint News Feed
C
Cisco Blogs
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
K
Kaspersky official blog
P
Palo Alto Networks Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
T
Threat Research - Cisco Blogs
The Hacker News
The Hacker News
T
Tor Project blog
NISL@THU
NISL@THU
The GitHub Blog
The GitHub Blog
Security Latest
Security Latest
aimingoo的专栏
aimingoo的专栏
C
CERT Recently Published Vulnerability Notes
Recorded Future
Recorded Future
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Google DeepMind News
Google DeepMind News
Martin Fowler
Martin Fowler
N
News | PayPal Newsroom
P
Privacy & Cybersecurity Law Blog
MyScale Blog
MyScale Blog
G
Google Developers Blog
V
V2EX
V
Visual Studio Blog
P
Privacy International News Feed
Google Online Security Blog
Google Online Security Blog
Microsoft Azure Blog
Microsoft Azure Blog
宝玉的分享
宝玉的分享
博客园 - 【当耐特】
L
LINUX DO - 热门话题
MongoDB | Blog
MongoDB | Blog
腾讯CDC
J
Java Code Geeks
The Last Watchdog
The Last Watchdog
L
Lohrmann on Cybersecurity
Cyberwarzone
Cyberwarzone
博客园 - 聂微东
Webroot Blog
Webroot Blog
S
Secure Thoughts

InfoQ - 促进软件开发领域知识与创新的传播

Meta 收购 Manus 这事儿泡汤了 5.5万 Star 开源项目 Ghostty 被迫出走,GitHub 正在终结一代技术人的乌托邦 Slack 长时运行多智能体系统的上下文管理方案 从 T+1 到分钟级:金城银行基于 Apache Doris 构建高可靠、强一致的实时数据平台 谷歌云推出 Agents CLI,简化 AI 智能体开发全流程 Claude官方击穿高薪、高学历的安全防线!Anthropic点名10大高危职业,但有群人暂时稳了 亚马逊云科技终止 WorkMail 服务,并将 App Runner 转入维护模式 OPPO小布记忆:全模态碎片化内容的理解与智能整理实践|AICon上海 模力工场038周AI应用周榜:工具在消失,工作流在出现 Akamai CEO Tom Leighton:Agent 时代来临,云基础设施正从“中心化”转向“分布式边缘” 日均数百亿入库背后:从“人肉调度”到K8s弹性架构,度小满金融基于OceanBase重构入库架构实践 百度文库网盘发布GenFlow 4.0:月活用户超1亿,要把网盘变成全端AI工作台 Altman 投的 Agent 终端 Warp 开源了!斩获3.5万star 哪些客户需要拒, 敢让龙虾决定吗?_AI&大模型_InfoQ 中文站_InfoQ精选视频 从开发到生产:为什么越来越多的机器学习团队纷纷迁移到 Snowflake | BUILD 2025_AI&大模型_王玮_InfoQ精选视频 探索多智能体工作流:LangGraph Snowflake Cortex AI | BUILD 2025_AI&大模型_王玮_InfoQ精选视频 腾讯云分布式缓存数据库:AI Agent - 从提示词工程到 Harness 工程 | 腾讯云数据库 DBTalk_腾讯_凌敏_InfoQ精选视频 基于 Streamlit 为 CSV 数据构建分析智能体 | BUILD 2025_AI&大模型_王玮_InfoQ精选视频 AI 智能体:告别文档缺漏 | BUILD 2025_AI&大模型_王玮_InfoQ精选视频 构建 AI 驱动的数据管道:深度探讨 Snowflake Openflow 与非结构化数据 | BUILD 2025_AI&大模型_王玮_InfoQ精选视频 云端太贵、本地不够聪明,英特尔押注“端云混合AI”:智能体PC会替人完成工作 不到10%的存储投入,可能拖垮90%的GPU投资!IBM把AI Agent塞进存储系统,算清企业最容易忽略的一笔账 Snowpark 上手实战 | BUILD 2025_大数据_王玮_InfoQ精选视频 ClickHouse + Langfuse,构建 Agent 可观测基石 腾讯云分布式缓存数据库:Cluster Proxy 共享连接架构深度解析 | 腾讯云数据库 DBTalk_腾讯_凌敏_InfoQ精选视频 AI 写代码太烧钱了:Copilot、Claude 一起涨价,不如把程序员请回来? 英特尔发布至强600系列工作站处理器与锐炫Pro B70 GPU,全新AI工作站来了 腾讯云分布式缓存数据库:从 Redis 到 Valkey - 开源社区如何快速创新 | 腾讯云数据库 DBTalk_腾讯_凌敏_InfoQ精选视频 印奇这次要“从0重做”智驾模型!首谈阶跃和千里双公司布局:中国AI商业闭环要靠车跑出来 从Cursor返聘归来,90后华裔女高管带Claude开启日更模式:token成本比工程师工资低多了! 从 Coding 到 Agent:QCon 北京 2026 全景复盘,优秀出品人 & 明星讲师名单揭晓 全链路支撑大模型国产化“Day 0适配”,商汤大装置构建全栈能力底座 凌晨,OpenAI 与亚马逊云科技史上最大联合发布来了 HashiCorp Vault 2.0 发布:引入新身份联邦机制,迈入 IBM 生命周期体系 Yelp 实现超 1,000 个 Cassandra 节点零停机升级 写了 17 年开源代码,我为什么认为 Coding Agents 堆功能是在瞎折腾? 基于 Apache Camel 编排智能体与多模态 AI 管道 面向智能体与人类用户的AI记忆系统:架构设计与核心场景实践|AICon上海 Anthropic 推出 Managed Agents,简化 AI 代理部署流程 阿里HappyHorse开启灰测,720P视频生成低至0.44元/秒 讯飞联合清华团队押注量子AI:不看营收、不设KPI,一群“无人区”科学家,抢夺下代AI算力入口 小米万亿模型全面开源:MIT 协议、1M 上下文,但还是打不过 DeepSeek Cortex Code 入门指南:面向数据工程师的实践路径 | 技术实践 openJiuwen社区首发Team Skills,定义Coordination Engineering新范式 用 Snowflake Cortex Agents 释放结构化数据的最大价值 | 技术实践 Grafana 利用 Kafka 对 Loki 进行了架构重构,并发布了一款命令行工具,旨在将可观测性引入编码代理 ClickHouse重构全文索引:对象存储上跑出高性能 Full-Text Search 可观测性和遥测技术如何提升软件工程实践 Dropbox 与 GitHub 合作,将单体库大小从 87GB 缩减至 20GB Agent 的下一站:基于长期记忆系统 EverOS 的自我演进|AICon上海 同一赛道,四种收费:Agent 控制层(Harness)开始分裂 Cloudflare Sandboxes 正式发布,为 AI 代理提供持久化隔离环境 Agent 的“记忆断片”困局,该怎么破?_AI&大模型_AICon 全球人工智能开发与应用大会_InfoQ精选视频 数据分析师如何快速建立在 AI 时代最值钱的能力:一份可落地的行动路线图 摩尔线程最新财报:研发占比超86%,万卡级大规模智算集群落地 当云区域失效:地缘动荡环境下的高可用重构 Slack 重构通知系统,设置参与度提升 5 倍 智能体工程的隐性技术债务 “我把所有模型都换成了DeepSeek V4”:月账单将降 90%,效果还更好 阿里云智能集团高级技术专家刘少伟已确认出席AICon上海站,并分享如何构建企业 Agent 的自动化行动架构 构建生产就绪的 tRPC API:Apollo Federation 的 TypeScript 替代方案 Anthropic推出面向Claude Code的基于智能体的代码审查功能 北京车展直击:斑马智能甩出车载Agent短剧,比亚迪率先落地,AI让智能座舱又热起来了 Snowflake 作为智能体运行时:从静态管道迈向自主数据系统 | 技术实践 Snowflake 上的本体体系:基于 Cortex Code 能力实现从架构到部署 | 技术实践 Cloudflare 公布 MCP 架构方案,应对企业面临的安全与治理风险 复杂的项目管理怎么做到「AI 友好」?飞书项目用「开放」给出答案 Snowflake Cortex Code 的规范驱动开发:将 SDLC 方法论引入 AI 辅助工作流 | 技术实践 Copilot 不让注册了:从“随便用”到“全面限”,agent 把原有订价模型顶穿了 当互联网用AI卷效率时,这家公司先问了一连串“能不能” Meta 开始记录员工每一次点击:AI 要接管工作,先监控会工作的人 Meta“Token榜”逼疯打工人,一夜烧掉公司几万刀!AI时代Token焦虑越来越离谱 智源FlagOS完成DeepSeek-V4-Flash在八款芯片Day0适配,实现三重技术突破 DeepSeek V4 重磅开源!首次打通华为Ascend,也没丢掉英伟达,百万上下文夺回国产模型话语权 李志飞的“新实验”:当超级个体撞上真实组织 GPT-5.5 登顶时刻,Anthropic 亲口承认 Claude 变笨了!网友群嘲:太敷衍 那些没空写的小需求,龙虾真能做吗?_AI&大模型_InfoQ 中文站_InfoQ精选视频 从 Pandas 到生产:使用任意 IDE 进行可扩展的 ML 数据管道与分布式处理 | BUILD 2025_AI&大模型_王玮_InfoQ精选视频 pnpm 11 候选版本发布,带来 ESM 分发、供应链默认设置以及新的存储格式 银行业PDF表格提取方案重构:基于Java的分层方案 GPT-5.5 赢了 Opus 4.7 和 Mythos?奥特曼晒黄仁勋内部信:英伟达全员用上 Codex! Cloudflare 推出 Think:一款面向 AI 代理的持久化运行时 1850亿美元天价支出、75%代码由AI生成!谷歌正式宣告:全面转向智能体工作流 xAI落后太多,马斯克“开大”重金求购Cursor,100亿美金“分手费”都敢签! Pulumi 新增对 Bun 运行时的全面支持 姚顺雨腾讯模型首秀!不卷参数只做 “听话打工人”,Hy3 preview登场 | 附实测 老板让你“忽悠”投资人,你敢发给龙虾吗?_AI&大模型_InfoQ 中文站_InfoQ精选视频 Gemini CLI 引入子代理机制,实现任务委派与并行代理工作流 清华系团队星工聚将完成数千万天使轮融资,轮式机器人拿下头部制造企业亿级大单 Pretext.js 绕过 DOM 布局重排,实现 120 FPS 的高级交互体验 靠“AI 云”爆红的 Vercel,栽在一个第三方AI工具手里!IPO前夕遭黑,200万美元赎金谈崩? 高能研讨会|端侧 AI 正在重写实时感知效率上限_AI&大模型_王玮_InfoQ精选视频 2050大会看这篇就够了|报名、交通食宿指引大全 Java 近期资讯:OpenJDK JEP、Jakarta EE 12、Spring Framework、Micrometer、Camel、JBang 金融智能的架构编排:基于 Snowflake Cortex Agents 实现结构化与非结构化数据统一分析 | 技术实践 在AK大神爆火的任务里,摸清国产AI真实水平 百灵Ling-2.6-flash 正式发布:高 Token 效率,以 1/10 消耗实现 SOTA 级 Agent 能力 当 PM 懂AI,当技术懂产品:AI 时代产品力的双向进化|PM x AI产品力领航者大会即将开幕 为 AI 智能体设计记忆机制:揭秘 LinkedIn 的认知记忆智能体 获奖名单公布|2026主题征文第一期|分享你最有价值的龙虾场景与核心 Skill_热门活动_InfoQ写作社区官方_InfoQ写作社区
探索 Snowflake 与 Postgres 之间的双向数据流动模式 | 技术实践
Tom Manfredi王玮张琰梓 · 2026-06-23 · via InfoQ - 促进软件开发领域知识与创新的传播

2026 年,智能体将在企业级应用中取得哪些实质性突破?点击下载《2026 年 AI 与数据发展预测》白皮书,获悉专家一手前瞻,抢先拥抱新的工作方式!

现代数据架构越来越要求事务型与分析型工作负载能够无缝共存。PostgreSQL 仍然是事务型应用的核心基础设施——支撑电商订单处理、实时库存系统以及面向客户的 API——而 Snowflake 则是所有分析型数据与 AI 的基础平台。挑战在于:如何让数据在这两个系统之间双向可靠流动,同时将延迟与运维开销降到最低。

历史上,要打通 OLTP 与 OLAP 系统,需要拼接外部 ETL 工具、管理云存储桶、配置 IAM 角色,并维护脆弱的 CDC 数据管道。团队花在基础设施“打通”上的时间,往往超过从数据中产生价值的时间。

本文的目标是探索如何利用 Snowflake 的一些最新创新能力,在 Postgres 与 Snowflake 之间支持五种关键的数据流动模式。如下所示:

有哪些变化?

近期 Snowflake 的一些产品能力显著简化了这一问题:

  • Snowflake Postgres(PuPr):一种完全托管的 PostgreSQL 服务,原生运行在 Snowflake 生态系统中。它消除了外部 PostgreSQL 托管的需求,同时与 Snowflake 数据平台实现一流集成;

  • pg_lake(PuPr):PostgreSQL 的扩展能力,允许在 Postgres 内直接创建 Apache Iceberg 表。在 Postgres 中写入的数据,可以通过共享 Iceberg 元数据被 Snowflake 直接查询——无需文件导出、无需中转存储、无需 ETL 管道;

  • pg_incremental(PuPr):用于调度式增量同步的扩展组件。与 pg_lake 结合使用时,可以实现轻量级 CDC,只同步发生变化的数据行;

  • Snowflake 托管 Iceberg 存储(PuPr):Postgres 管理的 Iceberg 表使用 Snowflake 内部存储,并通过托管凭证访问。无需外部 S3、无需 IAM、无需存储集成配置;

  • Openflow(正式发布):Snowflake 的托管数据集成平台(基于 Apache NiFi 构建),提供预置的 CDC 连接能力,包括基于 PostgreSQL WAL 的变更捕获,以及通过 Snowpipe Streaming 进行数据传输。

这些能力共同构建了一个完整的数据流动能力体系——从简单的批量加载,到实时 CDC——全部在一个统一平台内完成。

本文中的所有模式都使用 ORDERS 表作为示例数据源。该表模拟典型电商订单生命周期,约 28,000 行数据。本例中数据来源于 SNOWFLAKE_SAMPLE_DATA.TPCH_SF1.Orders。

CREATE TABLE cdc_demo.orders (    order_id        BIGINT PRIMARY KEY,    customer_id     BIGINT,    order_status    VARCHAR(1),    total_price     DECIMAL(15,2),    order_date      DATE,    order_priority  VARCHAR(15),    clerk           VARCHAR(15),    ship_priority   INTEGER,    comment         VARCHAR(79),    created_at      TIMESTAMP DEFAULT NOW(),    updated_at      TIMESTAMP DEFAULT NOW());

复制代码

模式 1:批量数据流动 —— Postgres 到 Snowflake

业务场景:某零售公司在 PostgreSQL 电商系统中全天处理订单。每天夜间,分析团队需要在 Snowflake 中获取所有订单的完整快照,用于报表分析、需求预测以及财务对账;

技术方案:在 Postgres 中创建 Iceberg 表。“USING Iceberg”子句允许 pg_lake 在 Postgres 内创建并写入 Iceberg 表。然后通过 INSERT/SELECT 将订单数据写入该表。

在 Snowflake 侧,创建目录集成(Catalog Integration)后再创建 Iceberg 表。这些操作属于元数据层操作,不涉及实际数据搬运。当 Iceberg 表创建完成后,即可在 Snowflake 中直接查询。

步骤 1:在 Postgres 中启用 pg_lake

-- Connect to Snowflake Postgres instanceCREATE EXTENSION IF NOT EXISTS pg_lake CASCADE;

复制代码

步骤 2:创建 Iceberg 表并批量加载数据

-- Create an Iceberg table and bulk load all orders into itCREATE TABLE cdc_demo.orders_iceberg (    order_id        BIGINT,    customer_id     BIGINT,    order_status    VARCHAR(1),    total_price     DECIMAL(15,2),    order_date      DATE,    order_priority  VARCHAR(15),    clerk           VARCHAR(15),    ship_priority   INTEGER,    comment         VARCHAR(79),    created_at      TIMESTAMP,    updated_at      TIMESTAMP) USING iceberg;-- Bulk load from the source tableINSERT INTO cdc_demo.orders_icebergSELECT * FROM cdc_demo.orders;

复制代码

步骤 3:在 Snowflake 中创建目录集成

-- In Snowflake: create a catalog integration pointing to the Postgres instanceCREATE OR REPLACE CATALOG INTEGRATION pg_orders_catalog  CATALOG_SOURCE = SNOWFLAKE_POSTGRES  TABLE_FORMAT = ICEBERG  CATALOG_NAMESPACE = 'cdc_demo'  REST_CONFIG = (    POSTGRES_INSTANCE = 'Snowflake_Postgres_Demo'    CATALOG_NAME = 'postgres'    ACCESS_DELEGATION_MODE = VENDED_CREDENTIALS  )  ENABLED = TRUE;

复制代码

步骤 4:在 Snowflake 创建 Iceberg 表

-- Create the Snowflake Iceberg table referencing the Postgres-managed Iceberg dataCREATE OR REPLACE ICEBERG TABLE orders_iceberg  CATALOG = 'pg_orders_catalog'  CATALOG_TABLE_NAME = 'orders_iceberg'  CATALOG_NAMESPACE = 'cdc_demo'  AUTO_REFRESH = TRUE;

复制代码

步骤 5:查询验证数据

SELECT COUNT(*) FROM orders_iceberg;SELECT order_status, COUNT(*), SUM(total_price) AS total_revenueFROM orders_icebergGROUP BY order_status;

复制代码

模式 2:批量数据流动 —— Snowflake 到 Postgres

业务场景:数据科学团队在 Snowflake 中构建订单优先级预测模型,结果需要回写到 Postgres,使业务系统能够实时展示预测结果;

技术方案:在 Snowflake 中生成结果表后,将数据写入 stage(Parquet 文件)。Postgres 从 stage 拉取数据并写入本地表。

步骤 1:创建存储集成

-- In Snowflake: create a storage integration for the Postgres managed storageCREATE OR REPLACE STORAGE INTEGRATION pg_stage_integration  TYPE = POSTGRES_INTERNAL_STORAGE  POSTGRES_INSTANCE = 'Snowflake_Postgres_Demo';-- Create a stage using this integrationCREATE OR REPLACE STAGE pg_orders_stage  RELATIVE_URL = '/orders_export'  STORAGE_INTEGRATION = pg_stage_integration;

复制代码

步骤 2:导出数据到 stage

COPY INTO @pg_orders_stage/orders_bulk_FROM (    SELECT        order_id,        customer_id,        order_status,        total_price,        order_date,        order_priority,        clerk,        ship_priority,        comment    FROM orders_iceberg)FILE_FORMAT = (TYPE = PARQUET)HEADER = TRUEOVERWRITE = TRUE;

复制代码

步骤 3:Postgres 读取数据

-- On Postgres: create the destination tableCREATE TABLE cdc_demo.orders_from_snowflake (    order_id        BIGINT PRIMARY KEY,    customer_id     BIGINT,    order_status    VARCHAR(1),    total_price     DECIMAL(15,2),    order_date      DATE,    order_priority  VARCHAR(15),    clerk           VARCHAR(15),    ship_priority   INTEGER,    comment         VARCHAR(79));-- Load the Parquet files from the stage into the Postgres tableCOPY cdc_demo.orders_from_snowflakeFROM '@STAGE/orders_export/orders_bulk_*.parquet';

复制代码

步骤 4:查询验证

SELECT COUNT(*) FROM cdc_demo.orders_from_snowflake;-- Returns: 28,373SELECT order_status, COUNT(*)FROM cdc_demo.orders_from_snowflakeGROUP BY order_status;

复制代码

模式 3:CDC —— 从 Postgres 到 Snowflake

业务场景:一个电商应用持续处理新订单、更新订单状态(已发货、已送达、已退货)以及取消订单。分析团队需要在几分钟内将这些变化同步到 Snowflake,而不是等待数小时,以支持展示订单履约指标与营收追踪的实时仪表盘;

技术方案:这代表典型的 OLTP → OLAP 模式,即在源数据库中检测数据变更,并将其传递到分析系统。在该模式中,Postgres 源表上的插入与更新操作会被捕获。系统每分钟检测一次变更,并将其写入 Iceberg 表。在 Snowflake 侧,会创建 catalog integration 和 Iceberg 表,并通过每分钟一次的 REFRESH 进行轮询,从而使最新变更可以被查询访问。

步骤 1:在 Postgres 上启用 pg_incremental 和 pg_cron

CREATE EXTENSION IF NOT EXISTS pg_cron;CREATE EXTENSION IF NOT EXISTS pg_incremental CASCADE;

复制代码

步骤 2:创建 Iceberg 目标表并执行初始批量加载

-- Create an Iceberg table for CDC dataCREATE TABLE cdc_demo.orders_iceberg_cdc (    order_id        BIGINT,    customer_id     BIGINT,    order_status    VARCHAR(1),    total_price     DECIMAL(15,2),    order_date      DATE,    order_priority  VARCHAR(15),    clerk           VARCHAR(15),    ship_priority   INTEGER,    comment         VARCHAR(79),    updated_at      TIMESTAMP) USING iceberg;-- Initial bulk load of current dataINSERT INTO cdc_demo.orders_iceberg_cdcSELECT order_id, customer_id, order_status, total_price, order_date,       order_priority, clerk, ship_priority, comment, updated_atFROM cdc_demo.orders;

复制代码

步骤 3:创建时间间隔 pipeline,用于检测并同步变更

-- Create a pg_incremental pipeline that runs every minute-- Uses the updated_at column to detect rows modified within each time intervalSELECT incremental.create_time_interval_pipeline(    'sync_orders_cdc',    '1 minute'::interval,    'INSERT INTO cdc_demo.orders_iceberg_cdc     SELECT order_id, customer_id, order_status, total_price, order_date,            order_priority, clerk, ship_priority, comment, updated_at     FROM cdc_demo.orders     WHERE updated_at >= $1 AND updated_at < $2',    source_table_name := 'cdc_demo.orders'::regclass,    schedule := '* * * * *');

复制代码

该 pipeline 会自动执行以下操作:

  • 每分钟通过 pg_cron 运行一次;

  • 检测 updated_at 落在当前时间区间内的行;

  • 将发生变化的数据追加写入 Iceberg 表;

  • 维护高水位线(last_processed_time),以实现高效处理;

  • 可以通过 CALL incremental.execute_pipeline('sync_orders_cdc') 手动触发。

步骤 4:在 Snowflake 中创建 Iceberg 表并启用自动刷新

-- On Snowflake: create Iceberg table referencing the CDC Iceberg dataCREATE OR REPLACE ICEBERG TABLE orders_iceberg_cdc  CATALOG = 'pg_orders_catalog'  CATALOG_TABLE_NAME = 'orders_iceberg_cdc'  CATALOG_NAMESPACE = 'cdc_demo'  AUTO_REFRESH = TRUE;-- Configure polling frequency (how often Snowflake checks for new Iceberg snapshots)ALTER CATALOG INTEGRATION pg_orders_catalog  SET REFRESH_INTERVAL_SECONDS = 60;

复制代码

步骤 5:在 Postgres 中模拟数据变更

-- On Postgres: simulate order changesUPDATE cdc_demo.ordersSET order_status = 'X', total_price = 1.00, updated_at = NOW()WHERE order_id IN (SELECT order_id FROM cdc_demo.orders LIMIT 3);INSERT INTO cdc_demo.orders (order_id, customer_id, order_status, total_price,    order_date, order_priority, clerk, ship_priority, comment, created_at, updated_at)VALUES (9999999, 30016, 'N', 999.99, CURRENT_DATE, '1-URGENT',    'Clerk#000000001', 0, 'Test CDC order', NOW(), NOW());-- Manually trigger the pipeline (or wait for pg_cron to run it)CALL incremental.execute_pipeline('sync_orders_cdc');

复制代码

步骤 6:在 Snowflake 中查询 / 验证数据

-- On Snowflake (after auto-refresh or manual refresh):ALTER ICEBERG TABLE orders_iceberg_cdc REFRESH;SELECT * FROM orders_iceberg_cdc WHERE order_id = 9999999;-- Returns the newly inserted order

复制代码

模式 4:CDC —— 从 Snowflake 到 Postgres

业务场景:一个集中式定价引擎在 Snowflake 中重新计算订单优先级,并基于库存水平、需求预测以及促销活动进行动态价格调整。这些重新计算后的结果需要回流到生产环境的 Postgres 数据库,从而使履约系统能够据此进行订单路由;

技术方案:在该场景中,我们使用 STREAM 来检测 Snowflake 中 ORDERS_ENRICHED 表的变更。该 STREAM 会在 TASK 中被引用,并且该 TASK 每 5 分钟触发一次,将变更数据复制到 stage 中并以 Parquet 文件形式存储。在 Postgres 端,这些变更会被 COPY 到 staging 表中,并最终通过 INSERT、UPDATE 或 DELETE 的方式应用到目标表。

步骤 1:在 Snowflake 中创建源表并启用变更追踪

-- Create a table in Snowflake that the pricing engine updatesCREATE OR REPLACE TABLE orders_enriched (    order_id        NUMBER(38,0) PRIMARY KEY,    customer_id     NUMBER(38,0),    order_status    VARCHAR(1),    total_price     NUMBER(15,2),    order_date      DATE,    order_priority  VARCHAR(15),    clerk           VARCHAR(15),    ship_priority   NUMBER(38,0),    comment         VARCHAR(79),    updated_at      TIMESTAMP_NTZ DEFAULT CURRENT_TIMESTAMP());-- Populate with initial dataINSERT INTO orders_enrichedSELECT order_id, customer_id, order_status, total_price, order_date,       order_priority, clerk, ship_priority, comment, CURRENT_TIMESTAMP()FROM orders_iceberg;-- Create a stream to capture changesCREATE OR REPLACE STREAM orders_enriched_stream  ON TABLE orders_enriched  SHOW_INITIAL_ROWS = FALSE;

复制代码

步骤 2:创建一个将变更导出到 Postgres stage 的任务

-- Create a task that runs every 5 minutes when changes are detectedCREATE OR REPLACE TASK export_order_changes_to_pg  WAREHOUSE = COMPUTE_WH  SCHEDULE = '5 MINUTE'  WHEN SYSTEM$STREAM_HAS_DATA('orders_enriched_stream')AS  COPY INTO @pg_orders_stage/cdc_changes/changes_  FROM (      SELECT          order_id,          customer_id,          order_status,          total_price,          order_date,          order_priority,          clerk,          ship_priority,          comment,          METADATA$ACTION AS change_action,          METADATA$ISUPDATE AS is_update,          updated_at      FROM orders_enriched_stream  )  FILE_FORMAT = (TYPE = PARQUET)  OVERWRITE = TRUE;-- Resume the taskALTER TASK export_order_changes_to_pg RESUME;

复制代码

步骤 3:将变更数据加载到 Postgres

-- On Postgres: create a staging table for incoming changesCREATE TABLE cdc_demo.orders_changes_staging (    order_id        BIGINT,    customer_id     BIGINT,    order_status    VARCHAR(1),    total_price     DECIMAL(15,2),    order_date      DATE,    order_priority  VARCHAR(15),    clerk           VARCHAR(15),    ship_priority   INTEGER,    comment         VARCHAR(79),    change_action   TEXT,    is_update       BOOLEAN,    updated_at      TIMESTAMP);-- Load changes from the stageCOPY cdc_demo.orders_changes_stagingFROM '@STAGE/orders_export/cdc_changes/changes_*.parquet';-- Apply changes using UPSERT logic (INSERT ... ON CONFLICT)INSERT INTO cdc_demo.orders_from_snowflake (order_id, customer_id, order_status,    total_price, order_date, order_priority, clerk, ship_priority, comment)SELECT order_id, customer_id, order_status, total_price, order_date,       order_priority, clerk, ship_priority, commentFROM cdc_demo.orders_changes_stagingWHERE change_action = 'INSERT'ON CONFLICT (order_id) DO UPDATE SET    customer_id = EXCLUDED.customer_id,    order_status = EXCLUDED.order_status,    total_price = EXCLUDED.total_price,    order_date = EXCLUDED.order_date,    order_priority = EXCLUDED.order_priority,    clerk = EXCLUDED.clerk,    ship_priority = EXCLUDED.ship_priority,    comment = EXCLUDED.comment;-- Handle true deletes (not part of an update pair)DELETE FROM cdc_demo.orders_from_snowflakeWHERE order_id IN (    SELECT order_id FROM cdc_demo.orders_changes_staging    WHERE change_action = 'DELETE' AND is_update = FALSE);-- Clean up stagingTRUNCATE cdc_demo.orders_changes_staging;

复制代码

模式 5:Openflow CDC —— 从 Postgres 到 Snowflake

业务场景:一个高吞吐量的订单处理系统需要亚秒级的 CDC 延迟,并且要求具备 exactly-once 交付保障。该系统每秒处理数千笔事务,任何数据丢失或重复都会影响财务报告的准确性;

技术方案:Snowflake Openflow 基于 Apache NiFi 构建,并提供连接器,可以针对源系统(本例为 Postgres)执行基于 WAL 的 CDC,该连接器称为 CaptureChangePostgreSQL。变更数据可以通过其他 Openflow 处理器进行转换、过滤与增强处理,随后通过 Snowpipe Streaming 推送到 Snowflake。这是从 Postgres 向 Snowflake 处理数据变更时延迟最低的方案。

  • CaptureChangePostgreSQL 通过逻辑复制连接 PostgreSQL 实例。它会创建一个复制槽(replication slot),对配置的表执行初始快照,然后持续读取 WAL(Write-Ahead Log,预写日志)流中的所有 INSERT、UPDATE 和 DELETE 操作;

  • Transform / Filter(可选处理器)可以对记录进行重组、过滤特定事件、添加计算字段,或将不同类型的变更路由到不同的目标端;

  • PutSnowpipeStreaming 通过 Snowpipe Streaming 的高性能架构,将记录直接写入 Snowflake 表。它通过 offset token 跟踪实现 exactly-once 交付,并且数据在摄取后数秒内即可被查询。

核心能力:

  • 近实时延迟:端到端交付以秒计,而不是分钟;

  • Exactly-once 语义:内置 offset 追踪机制可防止重复与数据丢失;

  • Schema 演进:自动适配源端 schema 的变化;

  • 软删除:被删除的行会标记为 _SNOWFLAKE_DELETED = TRUE,从而保留审计历史;

  • Journal 表:保留完整变更历史,用于合规与回放;

  • 无需自定义代码:通过 Openflow 参数实现完全声明式配置。

整体总结

在了解了这 5 种模式之后,下面将从多个维度对其进行对比总结,以帮助你在不同场景下选择最合适的方案:

结论

Snowflake + Snowflake Postgres 生态系统如今提供了完整的数据流动模式谱系——从使用 pg_lake 和 Iceberg 的简单批量加载,到通过 Openflow 实现的实时 CDC——全部都在一个统一平台内完成。

共享的 Iceberg 存储模型消除了传统架构中管理外部存储、IAM 策略以及文件格式所带来的复杂性,而 Openflow 则为需要亚秒级延迟的工作负载提供生产级 CDC 能力。

选择上:

  • 批量模式适用于追求简单性与成本效率的场景;

  • pg_incremental CDC 适用于在较少基础设施投入下平衡数据新鲜度的场景;

  • Openflow 适用于关键任务级实时数据管道。

最终采用哪种模式,取决于你的延迟需求、数据规模以及对运维复杂度的容忍程度——借助这些工具,你不再被限制在单一方案之中。

原文地址:https://medium.com/snowflake/exploring-bidirectional-data-movement-patterns-between-snowflake-and-postgres-563664bd6a8d

点击链接立即报名注册:Ascent - Snowflake Platform Training - China更多 Snowflake 精彩活动请关注专区