news 2026/1/27 9:31:22

Flink SQL ALTER 语句在线演进 Table/View/Function/Catalog/Model

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Flink SQL ALTER 语句在线演进 Table/View/Function/Catalog/Model

1. ALTER 语句是干嘛的

ALTER 用来修改已经注册到 Catalog 里的对象定义,包括:

  1. ALTER TABLE
  2. ALTER VIEW
  3. ALTER DATABASE
  4. ALTER FUNCTION
  5. ALTER CATALOG
  6. ALTER MODEL

核心价值:让你在不重建对象的情况下,完成schema 演进、主键/水位线调整、属性参数更新、重命名等操作。

2. Java 如何执行 ALTER(和 CREATE / DROP 一样)

在 Java 中直接用TableEnvironment.executeSql()执行 ALTER,成功返回OK,失败抛异常。

EnvironmentSettingssettings=EnvironmentSettings.newInstance()...TableEnvironmenttableEnv=TableEnvironment.create(settings);tableEnv.executeSql("CREATE TABLE Orders (`user` BIGINT, product STRING, amount INT) WITH (...)");// 1) 在第一列位置新增字段tableEnv.executeSql("ALTER TABLE Orders ADD `order` INT COMMENT 'order identifier' FIRST");// 2) 一次性新增多个组件:列、主键、水位线、列位置tableEnv.executeSql("ALTER TABLE Orders ADD ("+" ts TIMESTAMP(3), "+" category STRING AFTER product, "+" PRIMARY KEY(`order`) NOT ENFORCED, "+" WATERMARK FOR ts AS ts - INTERVAL '1' HOUR"+")");// 3) 修改:类型/NOT NULL/注释/位置/水位线策略tableEnv.executeSql("ALTER TABLE Orders MODIFY ("+" amount DOUBLE NOT NULL, "+" category STRING COMMENT 'category identifier' AFTER `order`, "+" WATERMARK FOR ts AS ts"+")");// 4) 删除 watermarktableEnv.executeSql("ALTER TABLE Orders DROP WATERMARK");// 5) 删除列tableEnv.executeSql("ALTER TABLE Orders DROP (amount, ts, category)");// 6) 重命名列/表tableEnv.executeSql("ALTER TABLE Orders RENAME `order` TO order_id");tableEnv.executeSql("ALTER TABLE Orders RENAME TO NewOrders");// 7) 修改 catalog 属性tableEnv.executeSql("CREATE CATALOG cat2 WITH ('type'='generic_in_memory')");tableEnv.executeSql("ALTER CATALOG cat2 SET ('default-database'='db')");

3. ALTER TABLE:最重要、最常用的一类

3.1 支持的动作总览(记住这 6 个就够了)

ALTERTABLE[IFEXISTS]table_name {ADD...|MODIFY...|DROP...|RENAMEold_columnTOnew_column|RENAMETOnew_table_name|SET(...)|RESET(...)}

你可以把它理解为:

  • ADD:加东西(列/主键/水位线/分区/桶)
  • MODIFY:改东西(列定义/位置/主键列/水位线策略/分布)
  • DROP:删东西(列/主键/水位线/分区/分布)
  • RENAME:改名(列/表)
  • SET/RESET:改属性(connector options 等)

4. ADD:给已有表“加能力”

4.1 新增列(默认加到最后,可指定 FIRST / AFTER)

ALTERTABLEMyTableADDcategory_id STRINGCOMMENT'identifier of the category';ALTERTABLEMyTableADDnew_col STRINGFIRST;ALTERTABLEMyTableADDnew_col STRINGAFTERold_col;

4.2 一次性新增:列 + 计算列 + 主键 + Watermark

这是生产最常用的“演进组合拳”:

ALTERTABLEMyTableADD(log_ts STRINGCOMMENT'log timestamp string'FIRST,tsASTO_TIMESTAMP(log_ts)AFTERlog_ts,PRIMARYKEY(id)NOTENFORCED,WATERMARKFORtsASts-INTERVAL'3'SECOND);

4.3 新增分区(以及分区属性)

ALTERTABLEMyTableADDPARTITION(p1=1,p2='a')WITH('k1'='v1');ALTERTABLEMyTableADDPARTITION(p1=1,p2='a')WITH('k1'='v1')PARTITION(p1=1,p2='b')WITH('k2'='v2');

4.4 新增分布/桶(DISTRIBUTION)

ALTERTABLEMyTableADDDISTRIBUTIONBYHASH(uid)INTO4BUCKETS;ALTERTABLEMyTableADDDISTRIBUTIONBY(uid)INTO4BUCKETS;ALTERTABLEMyTableADDDISTRIBUTIONBY(uid);ALTERTABLEMyTableADDDISTRIBUTIONINTO4BUCKETS;

重要提醒:把某列加入主键,会隐式把该列的可空性改成 NOT NULL(nullability 会变为 false)。

5. MODIFY:改列类型、位置、注释、可空性、主键与水位线

5.1 改字段定义(类型/注释/位置)

ALTERTABLEMyTableMODIFYmeasurementDOUBLECOMMENT'unit is bytes per second'AFTERid;

5.2 改 watermark 策略、主键列、计算列

注意:被 MODIFY 的列/组件必须已存在于 schema 中。

ALTERTABLEMyTableMODIFY(log_ts STRINGCOMMENT'log timestamp string'AFTERid,tsASTO_TIMESTAMP(log_ts)AFTERlog_ts,PRIMARYKEY(id)NOTENFORCED,WATERMARKFORtsASts);

同样提醒:把某列改成主键列,也会隐式变为 NOT NULL。

6. DROP:删列 / 主键 / watermark / 分区 / 分布

ALTERTABLEMyTableDROPmeasurement;ALTERTABLEMyTableDROP(col1,col2,col3);ALTERTABLEMyTableDROPPRIMARYKEY;ALTERTABLEMyTableDROPPARTITION(`id`=1);ALTERTABLEMyTableDROPPARTITION(`id`=1),PARTITION(`id`=2);ALTERTABLEMyTableDROPWATERMARK;ALTERTABLEMyTableDROPDISTRIBUTION;

7. RENAME:改列名 / 改表名

ALTERTABLEMyTableRENAMErequest_bodyTOpayload;ALTERTABLEMyTableRENAMETOMyTable2;

8. SET / RESET:修改表属性(常用于 connector 参数)

8.1 SET:覆盖或新增属性

ALTERTABLEDataGenSourceSET('rows-per-second'='10');

8.2 RESET:恢复属性默认值

ALTERTABLEDataGenSource RESET('rows-per-second');

9. ALTER VIEW / DATABASE / FUNCTION / CATALOG / MODEL

9.1 ALTER VIEW:改名 or 改查询定义

ALTERVIEWmy_viewRENAMETOmy_view_v2;ALTERVIEWmy_viewASSELECT...;

9.2 ALTER DATABASE:更新库属性

ALTERDATABASEmy_dbSET('k1'='v1','k2'='v2');

9.3 ALTER FUNCTION:替换 UDF 标识(类路径/全限定名)+ 语言

ALTERFUNCTIONmy_udfAS'com.xxx.NewUdf'LANGUAGEJAVA;ALTERTEMPORARYSYSTEMFUNCTIONfAS'com.xxx.F'LANGUAGEJAVA;

IF EXISTS时:函数不存在就忽略,不报错。

9.4 ALTER CATALOG:SET / RESET / COMMENT

ALTERCATALOG cat2SET('default-database'='db');ALTERCATALOG cat2 RESET('default-database');ALTERCATALOG cat2COMMENT'comment for catalog ''cat2''';

9.5 ALTER MODEL:SET / RESET / RENAME

ALTERMODEL MyModelSET('model-version'='2.0','batch-size'='32');ALTERMODEL MyModel RESET('model-version','batch-size');ALTERMODEL MyModelRENAMETONewModel;

10. 最佳实践与常见坑(建议放到博客结尾)

  1. 复杂变更尽量用“一个 ALTER 多组件”:比如一次性加计算列 + watermark + 主键,避免多次演进导致不一致。
  2. 主键列会隐式 NOT NULL:这点会影响下游 sink(尤其是 upsert),提前确认数据里有没有 null。
  3. watermark 修改属于“语义级变更”:会影响窗口计算、延迟、迟到数据处理,建议在灰度环境验证。
  4. SET/RESET 特别适合做运行参数调节:例如 datagen 的速率、某些 connector 的行为开关,脚本化很好用。
  5. 尽量加IF EXISTS(表/函数等支持时):让运维脚本幂等,避免多环境重复执行失败。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/26 10:30:55

必藏!10种大模型训练与微调方法原理,AI产品经理程序员入门必备

在大模型落地热潮中,无论是AI产品经理规划技术路径,还是程序员动手实操,都绕不开模型训练与微调这一核心环节。选对微调方法,能让70B大模型在单卡24GB显存上跑起来,还能让领域任务准确率提升10%以上。本文整理了10种核…

作者头像 李华
网站建设 2026/1/23 15:55:27

PyTorch安装环境配置Qwen3-VL-8B全过程详解

PyTorch 环境配置与 Qwen3-VL-8B 多模态模型部署实战 在智能应用日益依赖“看懂图像并理解语言”的今天,多模态大模型正从实验室走向真实业务场景。无论是电商平台中用户上传一张商品图问“这鞋多少钱”,还是客服系统里发来一张报错截图求解决方案&#…

作者头像 李华
网站建设 2026/1/17 2:12:42

豆包AI手机为何会遭到全网“围剿”?大厂们到底在怕什么?

2025年12月,豆包科技推出的豆包AI手机一经面世,立刻引发了科技界和社交媒体上的广泛讨论。这款手机的推出几乎可以称得上是一次“科技革命”,因为它不仅在硬件和软件上都进行了深度的革新,还通过其强大的AI系统,使得智…

作者头像 李华
网站建设 2026/1/26 8:26:22

穆罕默德·本·苏拉耶姆连任国际汽联 (FIA) 主席

国际汽车联合会 (FIA) 作为全球赛车运动的管理机构及世界移动出行组织的联盟,今日确认穆罕默德本苏拉耶姆已连任主席。该决议经乌兹别克斯坦共和国塔什干会员大会选举,其主席名单获得通过。穆罕默德本苏拉耶姆主席现已开启其第二个四年任期。自 2021 年首…

作者头像 李华
网站建设 2026/1/26 20:24:33

Qt实现的完美的Dock窗口布局,窗口移动嵌入到上下左右其他位置,能任意拖动窗口嵌入到其他位置...

Qt实现的完美的Dock窗口布局,窗口移动嵌入到上下左右其他位置,能任意拖动窗口嵌入到其他位置中。 源码: 使用Qt5.13.1_MinGW编译通过。o.15Dock窗口布局的丝滑体验背后藏着不少技术细节,今天咱们直接扒开源码看看Qt是怎么玩转这个…

作者头像 李华
网站建设 2026/1/26 21:16:57

Git LFS存储大模型权重文件的最佳实践

Git LFS存储大模型权重文件的最佳实践 在深度学习项目日益复杂的今天,一个训练好的大模型动辄数十GB,而团队协作中却仍需频繁切换版本、复现实验、部署服务。你是否经历过这样的场景:克隆仓库等了半小时,结果发现只是因为某个同事…

作者头像 李华