BigQuery 上线 identity columns,把主键生成从应用代码收进引擎;AWS 用三条 CREATE MATERIALIZED VIEW 重建 Medallion 架构,编排、增量与 CDC 一并折叠进表格式;Flink 2.3 + Iceberg 1.11 的 Dynamic Iceberg Sink 在记录级决定落表目标并自动演进 schema,新增事件类型无需重启作业;Databricks 为 Genie Agents 开放 Agent mode API 与 Unity Catalog volumes 非结构化接入,把文档上下文纳入既有治理边界
本期聚焦 DataInfra 四条动态,共同指向一条主线:把原本写在流水线外围的胶水代码折叠进引擎与表格式——主键不用应用生成、编排不用 DAG、新事件类型不用改代码重启、非结构化文档不用另建 RAG 管道。
第五十六期追踪到 DataInfra 领域四条动态,日期集中在 9 月 2 日至 3 日:BigQuery 上线 identity columns——用
GENERATED ALWAYS AS IDENTITY与GENERATED BY DEFAULT AS IDENTITY两种声明让引擎接管 64 位顺序主键的生成,应用层与 ETL 工具不必再预计算唯一键,INSERT与MERGE都能直接吃到这份自动化;AWS 把 Medallion 架构压缩成三条CREATE MATERIALIZED VIEW——在 SageMaker Unified Studio 上以 S3 Tables 为底座,由 Iceberg 行级变更跟踪(position-delete / equality-delete)驱动增量刷新,编排 DAG、高水位与 CDC 代码全部消失,只留 SQL 转换逻辑本身;Flink 2.3 与 Iceberg 1.11.0 的 Dynamic Iceberg Sink 把路由粒度下沉到单条记录——DynamicRecordGenerator在运行时解析目标表并在表不存在时建表,新字段自动作为 optional column 加进去,作业不重启、表不重写;Databricks 扩展 Genie Agents——Agent mode 全量开放并配套 SSE 流式 API,单个 agent 可挂载最多 10 个 Unity Catalog volumes,PDF、文档、图片与受治理的表在同一轮对话里被一起分析。四条动态的厂商、层次与对象各不相同,方向却高度一致:把原本写在流水线外围的那段胶水代码,折叠进引擎和表格式里。
BigQuery identity columns:让引擎接管主键生成
事件概述
9 月 2 日至 3 日间,Google Cloud 在 Data Analytics 博客发布 identity columns 的正式上线公告。这个功能允许用户在建表时声明某一列由 BigQuery 自动生成 64 位顺序整数,用来做唯一标识符。产品负责人 Wawrzek Hyska 与软件工程师 Aayush Bhatnagar 在文中把落点放在数据摄取路径上:过去工程师需要在应用逻辑或 ETL 工具里预先算出唯一键,现在这段责任被移交给 BigQuery 自身。
对数据工程团队而言,这不是一个”多了一个函数”级别的更新。代理主键的生成看似琐碎,实际横跨多个环节:批量加载要防止重号,流式写入要保证单调,重试与回填要避免撞键,MERGE 语义下还要手工处理”目标表已有值”与”源端无值”的分支。BigQuery 把这些分支统一收进列定义里。
技术解析
- 两种声明语义:
GENERATED ALWAYS AS IDENTITY由 BigQuery 全权管理并担保唯一性,用户无法写入该列;GENERATED BY DEFAULT AS IDENTITY提供自动值但允许手工覆盖,适合需要回填历史数据或迁移既有主键的场景。 - 建表语法:
order_id INT64 GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1),起始值与步长均可在列定义里指定。 - 与 DML 的兼容:identity 列适配标准 DML 操作,
INSERT与MERGE都能自动为新行分配标识,无需在语句里显式处理该列。上文示例中的写入简化为INSERT INTO orders (customer_name, order_date) VALUES (...),order_id不再出现在列清单里。 - 收益三条:摄取路径不必预先计算键(streamlined ingestion);SQL 代码里少掉键管理的样板(reduced boilerplate);键管理与 DML 原生集成(integrated automation)。
行业影响
把身份生成下沉到引擎,本质上是把一段分布式一致性问题从应用侧搬进了存储层。应用侧算主键的代价不只在于代码量,更在于它要求每个写入方都遵守同一套约定——一旦某个作业绕开了约定,重复键就要靠下游去重来兜底,而下游去重的成本通常远高于在建表时声明一次。
这条更新也让 BigQuery 在与传统数据仓库的迁移对话中少了一个摩擦点:从 Teradata、Oracle、PostgreSQL 迁来的 schema 里,IDENTITY 与 SEQUENCE 是常见构造,此前往往需要改成 GENERATE_UUID() 或 ROW_NUMBER() 之类的替代写法。这类”语义对齐”型的小功能,对迁移项目的实际推进速度影响往往大于一两个大特性。
相关链接
三条 CREATE MATERIALIZED VIEW 重建 Medallion:编排、增量与 CDC 折叠进表格式
事件概述
9 月 2 日,AWS Big Data Blog 发布教程,展示如何在 Amazon SageMaker Unified Studio 中用 Iceberg materialized views 搭建 Bronze / Silver / Gold 三层架构。文章的核心主张是:一条 medallion 流水线可以用三条 SQL 语句表达,转换、编排与增量处理被折叠进每一层的定义里,没有 ETL 作业、没有编排器、也没有需要维护的变更数据捕获代码。
教程以网约车行程数据为例:Bronze 是 S3 Tables 上的 Iceberg 表 trips_bronze,Silver 是物化视图 mv_trips_silver(做时间戳转换、NULL 过滤并派生 revenue_per_mile 与 rating_category),Gold 则是在 Silver 之上再叠一层物化视图——mv_city_daily_metrics 与 mv_vehicle_performance。Gold 建立在 Silver 之上形成 MV on MV 的声明式依赖链,每层的定义指向其下层,系统按刷新配置自行决定每层重新处理哪些数据。
技术解析
-
增量刷新的依据来自表格式:AWS Glue 用 Iceberg 的行级变更跟踪(
position-delete与equality-delete文件)识别自上次刷新以来变更的行,只处理这些行。教程中向 Bronze 插入 3 条记录后,Silver 刷新仅处理这 3 条——没有高水位、没有快照对比、没有变更流管道。 -
调度语法与最小粒度:
SCHEDULE REFRESH EVERY 1 DAY,也支持按小时;最小调度粒度为 1 小时,不支持亚小时级新鲜度。手动刷新用REFRESH MATERIALIZED VIEW。 -
依赖链示意:
trips_bronze (table) └── mv_trips_silver (materialized view) ├── mv_city_daily_metrics (MV on MV, daily schedule) └── mv_vehicle_performance (MV on MV, daily schedule) -
刷新以原子方式执行,由 Glue Data Catalog 用托管 Spark 计算完成,用户不写、不版本化、不部署作业制品。
-
成本口径:物化视图自动刷新按 每 DPU-hour 0.44 美元计费(1 DPU = 4 vCPU + 16 GB 内存),按秒计费、1 分钟起收。教程规模(300 条记录)跑完全流程约消耗 0.5 DPU-hour 以内,折合约 0.22 美元 的 Glue 计算费;三层流水线的搭建耗时不到 2 分钟。
-
六条限制必须写进设计文档:① 无亚小时级新鲜度;② 级联刷新不是自动的——刷新 Silver 不会在同一操作中触发 Gold,每层按各自调度或需按顺序手动触发;③ 增量 REFRESH 检测不到行删除,需要传播删除时必须用
REFRESH ... FULL;④ 仅支持 SQL 子集,部分窗口函数、UDF 与复杂表达式不受支持;⑤ 源 schema 以影响定义的方式变化时必须 drop 并重建物化视图;⑥ Iceberg materialized views 不属于开源 Apache Iceberg 规范,无法移植到非 AWS 环境。 -
服务支持面:创建与刷新需使用 Amazon Athena Spark、AWS Glue 5.1 及以上、或 Amazon EMR 7.12 及以上;教程环境跑在 SageMaker Unified Studio 的 Notebook 上,运行时可选 Athena Spark 或 Glue Spark。
行业影响
这条动态最值得琢磨的不是”用 SQL 写流水线”——声明式转换早就有了——而是增量处理的凭据从”管道自己记的状态”换成了”表格式记的状态”。传统方案里,高水位、快照版本、变更流位点都由编排系统保存,一旦作业被改、被重跑、被回滚,这些状态就会与数据脱节,而排查这类脱节耗时且没有通用方法。Iceberg 把”哪些行变了”写进了自己的元数据,任何有权读表的引擎都能得出同一份答案,状态与数据不再分离。
限制清单里的第 ⑥ 条同样关键。物化视图是 AWS 的私有扩展,不在 Iceberg 规范内,这意味着选择它等于接受一层引擎绑定——这与 Vol.53 以来持续追踪的”开放表格式类型系统收敛”构成张力。工程上的判断很清楚:如果跨云可移植性是硬约束,这一层就不该放进架构;如果工作负载已经锁在 AWS 上,用私有扩展换掉一整套编排器是划算的。
相关链接
- Building medallion architecture with Iceberg materialized views in Amazon SageMaker(AWS Big Data Blog)
- Using materialized views with AWS Glue(AWS 文档)
- Query AWS Glue Data Catalog materialized views(Amazon Athena 文档)
Dynamic Iceberg Sink:在记录级决定落表目标,schema 演进不再需要重启作业
事件概述
同日(9 月 2 日),AWS Big Data Blog 发布第二篇 Iceberg 相关教程,这次面向流侧。文章展示如何在 Amazon Managed Service for Apache Flink 上用 Apache Flink 2.3 + Apache Iceberg 1.11.0 的 Dynamic Iceberg Sink 构建”动态流式数据湖”:管道能在新事件类型出现、上游 schema 变化时自适应,不必停流。
核心机制是 DynamicRecordGenerator 与 DynamicRecord。每条输入记录经过生成器后,携带目标表标识、Iceberg schema、行数据与分区规范,由 sink 决定写往哪里。表不存在就创建,记录带了新字段就演进 schema,一个作业即可把 order_events、interaction_events、user_events 以及未来新增的类型分别写入各自的 Iceberg 表,无需为每种类型额外定义 sink。
技术解析
- 路由粒度是单条记录,不是管道配置:默认路由字段是
event_type,表名来自显式 table-name 字段(若存在)或路由字段本身;schema 推断按 signature 缓存,PartitionSpec 按 schema 缓存,避免逐条重算。 - schema 演进流程:写入每条记录前比较记录的 schema 与目标表的当前 schema,若记录含新字段,Iceberg 将其加为 optional column 并随下一个 data file 提交;已有文件保持有效,无需重写表,查询旧文件时新列返回
null。 - 支持的非破坏性变更:加列、扩类型(
int→long、float→double)、把 required 列放宽为 optional、删列。撰写本文时不支持重命名列。 - 两种可互换的 schema 来源:
- 运行时 JSON 推断(
SchemaAgnosticRoutingGenerator):方便,但推断天然有损——JSON 不带类型信息,整型统一加宽为LongType、浮点为DoubleType、ISO-8601 时间戳为TimestampType(微秒)。没有契约意味着生产者可以静默改变字段的类型或含义。 - AWS Glue Schema Registry + Avro(
AvroToDynamicRecordGenerator):提供精确类型(long保持 long、timestamp-micros 保持微秒精度)、在注册时用兼容性规则(如BACKWARD)强制治理演进、以及生产者与消费者共享的单一事实来源。不兼容的生产者变更在注册时被拒绝,而不是在写入时。
- 运行时 JSON 推断(
immediateTableUpdate的两难:设为true,看到新 schema 的 writer subtask 在发出记录前内联应用 create/alter,延迟最低,代价是对 catalog 的并发调用更多;设为false,需要变更的记录绕行到一个按表名 keyBy 的 update operator,同一表的更新一次一个,稳态下不增加额外 shuffle,代价是变更记录多走一段路。两种取值的 schema 比较逻辑与最终表变更完全相同。- 分区规范由生成器决定:
partition.candidates是一个全局候选字段列表(不是每表独立),每张表只取自己 schema 里存在的字段;候选字段后来出现或消失时,sink 通过 Iceberg partition-spec evolution 增删分区字段,这是纯元数据更改,已写入的文件保留其写入时的规范。若某表没有任何候选字段,会被创建为未分区表——所以候选列表务必包含 event-time 字段,否则生产者换个字段名(比如从event_time改成create_timestamp)就会静默产出未分区表。 - 一致性保证:Flink checkpointing 的 exactly-once 叠加 Iceberg 两阶段提交,端到端无重复、无丢失。
- 多流 fan-in 的账要算清:多个 Kinesis 流可以
union后进入同一个 sink。union 不额外增加 shuffle 成本——sink 总是按内部的 per-table writer key 重新分发记录,单流与 N 条独立管道每条记录产生的 exchange 相同。但隔离性有代价:所有表共享一个 writer pool、一个 commit aggregator 与一个 committer,热流的背压与 checkpoint 对齐会耦合到其余所有流,且 writer parallelism 是作业级单值设置。文章给出的取舍是——大量中小体量事件类型适合合并池化,体量大到需要独立并行度与故障隔离的流应当拆成独立应用。
行业影响
流式数据湖最贵的一笔成本长期不在计算,而在变更的协调成本:上游加一个字段,下游要改作业、改表、安排重启窗口、确认在途数据不丢。Dynamic Iceberg Sink 把这件事降级为一次元数据提交——新列以 optional 形式出现,旧文件照旧可读,作业继续跑。
这篇教程的价值还在于它没有只讲好处。JSON 推断”有损且无契约”被明确写出来,partition.candidates 是全局而非每表、可能静默产出未分区表也被点名,union 后共享 writer pool 导致的背压耦合同样在列。对准备落地的团队来说,这几条比主干功能更能决定成败:选 GSR + Avro 而不是 JSON 推断,本质上是在为”上游不会静默改语义”这件事付费。
相关链接
- Build a dynamic streaming data lake with Apache Iceberg and Apache Flink(AWS Big Data Blog)
- 示例代码仓库 aws-samples/sample-streaming-data-lake-with-apache-iceberg-and-apache-flink
Genie Agents 扩展:Agent mode 全量开放,非结构化文件走进 Unity Catalog 治理边界
事件概述
9 月 2 日,Databricks 发布 Genie Agents 的能力扩展公告,四项更新一并落地:Agent mode 面向所有 Genie Agents 开放并配套 API、Unity Catalog volumes 中的非结构化文件可被直接分析、Genie Code 用于 agent 的批量构建与调优、对话可分享给同事与 agent 管理者。这是自 Data + AI Summit 上 Genie Spaces 演进为 Genie Agents 之后的一次集中扩容。
前两项是这次更新的技术主干。Agent mode 是支撑多步分析的 agentic reasoning loop——它不再”查一次就回答”,而是制定并 refine 研究计划、跨多轮迭代查询探索数据、返回带结论、可视化与引用的报告。非结构化接入则让 PDF、文档、幻灯片与图片与受治理的表在同一轮对话中被一起分析。
技术解析
- Agent mode 与 Chat mode 的分工:Chat mode 适合快速的事实性查询;Agent mode 面向需要推理的开放式问题。官网措辞是,对于那些过去需要一名数据分析师加上一份完整研究计划的问题,Agent mode 现在可以充当实时研究伙伴。
- Agent mode APIs:开发者可以把多步推理带出 Databricks UI,集成进自定义应用、聊天机器人、定时报告与内部工具,响应通过 Server-Sent Events 流式下发。API 支持保持完整会话与追问,也能以编程方式取回 Agent mode 的会话与消息用于监控;可视化内容另有下载接口,可与文本回答一并返回。
- UC volumes 接入的边界:单个 Genie Agent 最多挂载 10 个 volumes。非结构化分析跑在 Agent mode 下,用多步推理检索并分析最相关的文件内容;它遵守 Unity Catalog 权限——用户只能看到自己有权访问的文件。
- content search 解决规模问题:面向较大的文档集合,content search 会预先准备并索引文件,提升 agent 的推理质量并降低回答延迟。
- Genie Code 把调优也交给 agent:描述 agent 的用途、示例问题与数据源后,Genie Code 会创建 agent 并补上一组指令——它复用 Unity Catalog 中关于相关表的元数据,以及历史上针对这些表的查询。上线后,Genie Code 可分析具体失败的会话或 benchmark 运行来定位问题,并可汇总高频问题主题与反馈趋势来识别知识缺口。所有建议(指令、示例 SQL、knowledge store 配置)在保存前都需人工复核。
行业影响
把非结构化文件挂进 Unity Catalog volumes 而不是另建一套 RAG 管道,是这次更新里最值得注意的架构选择。企业里”文档问答”通常意味着第二条链路:独立的向量库、独立的摄取作业、独立的一套权限——两套权限模型长期漂移,是这类系统最难收拾的技术债。Databricks 的做法是让文件复用已经存在的治理边界:权限判定发生在 Unity Catalog,而不是在摄取时拷贝一份。代价也清楚——单个 agent 限挂 10 个 volumes,说明这条路目前面向的是”精选文档集”,而非”整个数据湖的语料”。
Agent mode API 走 SSE 流式返回,则暴露了另一层意图:多步分析的耗时以分钟计,同步接口在工程上不可用。把 Agent mode 做成可流式订阅的接口,意味着 Databricks 预期它被嵌进面向终端用户的产品(客户侧分析门户、内部 Slack bot、自定义看板),而不只是留在自己的 UI 里。
相关链接
- Expanding Genie Agents: Deep analysis, file reasoning, and more(Databricks Blog)
- Genie Agents concepts:Agent mode(Databricks 文档)
- Agent mode API 参考
- Genie Agents 使用 Unity Catalog volumes
编者评
四条动态的发布方、技术层次与作用对象全不相同,收拢起来却是同一件事:把一段原本必须自己写的代码删掉。BigQuery 删掉的是应用侧的键生成逻辑,AWS 的两篇删掉的是编排 DAG、高水位与 CDC 代码以及”新事件类型 → 改代码 → 重启”的循环,Databricks 删掉的是为非结构化文档另建一套 RAG 摄取管道的必要性。被删除的这些代码有个共同名字:胶水——它们不产生业务价值,存在的唯一理由是下游系统读不懂上游系统的状态。
而它们之所以现在能被删掉,是因为状态有了公认的存放位置。Iceberg 的 delete 文件回答了”哪些行变了”,Iceberg 的 schema 与 partition-spec 演进回答了”字段与分区怎么变”,Unity Catalog 的权限模型回答了”谁能看什么”,引擎的列定义回答了”主键从哪来”。胶水代码的本质是”一方不知道另一方知道什么”,当这些答案被写进表格式与目录、且任何有权限的引擎都能读到同一份时,胶水就失去了存在理由。
值得留意的是这套迁移并非没有代价,而代价的形态变了:过去是为每段胶水付运维成本——改作业、排重启窗口、排查状态脱节;现在是为每次折叠付约束成本——Iceberg 物化视图是 AWS 私有扩展、不可移植也不支持亚小时新鲜度;JSON 推断有损且无契约,要精确类型就得接受 Glue Schema Registry 的注册治理;UC volumes 限挂 10 个,意味着它服务精选文档集而非全量语料。成本从”分散的、不可预测的运维事件”变成了”集中的、写在文档里的能力边界”。对架构决策来说这是笔划算的交易——边界可以读、可以评估、可以写进设计评审,而凌晨三点的状态脱节不能。