Flink SQL 的 USE / USE CATALOG / USE MODULES(Catalog、Database、Module 三件套)

1、USE CATALOG:切换当前 Catalog

sql 复制代码
USE CATALOG cat1;

含义:把"当前 catalog"设置为 cat1。

之后你写:

sql 复制代码
SHOW DATABASES;
CREATE TABLE t1 (...);

如果没有显式写 catalog.db.table 的全限定名,Flink 会默认把对象解析到 cat1 这个 catalog 里。

默认值 :default_catalog
不存在会怎样:直接抛异常(这点非常重要,很多人以为会自动创建)。

2、USE:切换当前 Database(可带 catalog 前缀)

sql 复制代码
USE db1;

含义:把当前 database 设置成 db1。

之后你写 CREATE TABLE Orders (...),它会落在:
当前catalog.db1.Orders

也可以写全一点:

sql 复制代码
USE cat1.db1;

这相当于一次性把 catalog + database 都切到目标位置(具体支持程度以你环境对 catalog/database 的实现为准,但语义就是"按前缀解析")。

默认 database :default_database
db 不存在:抛异常。

3、USE MODULES:切换"函数/类型/规则"的解析顺序(非常实用,也非常容易忽略)

sql 复制代码
USE MODULES hive;

这句不是切 catalog/db,而是控制"元数据解析优先级"。它影响的典型对象包括:

  • 内置/扩展 函数(比如 hive 内置函数)
  • 用户自定义类型(UDT)
  • 规则、元数据解析(文档里统称 metadata)
3.1 什么是解析顺序?

当你执行:

sql 复制代码
SELECT my_func(x) FROM t;

Flink 会按 USE MODULES 声明的顺序去查找 my_func 到底来自哪个模块。

如果你启用了多个模块,还能指定优先级:

sql 复制代码
USE MODULES hive, core;

意思就是:优先在 hive 模块里找,找不到再去 core 里找。

3.2 "loaded" 与 "used"的区别(核心坑点)

文档含义是:

  • 模块被 load 后,默认是 used=true(可用)
  • 但一旦你执行 USE MODULES ...,只有出现在列表里的模块会保持 used
    没出现在列表里的,即使已经 loaded,也会变成 disabled(used=false)

所以你会看到类似:

sql 复制代码
SHOW FULL MODULES;
-- hive true
-- core false

这就是为什么"我之前还能用的函数突然找不到了"的典型原因之一:你换了模块启用列表。

4、Java 里怎么用?(executeSql 返回 OK 的那种)

在 Java(TableEnvironment / StreamTableEnvironment)里,你直接:

java 复制代码
tEnv.executeSql("USE CATALOG cat1");
tEnv.executeSql("USE db1");
tEnv.executeSql("USE MODULES hive");

成功会返回 OK(或者对应的 TableResult 可打印),失败则抛异常。

建议你在平台化/脚本执行场景里,把每一次 USE 都当成"可能失败的边界",明确 catch 并记录上下文(当前 catalog/db/modules)。

5、一套推荐的"工程化用法"(避免环境漂移)

如果你在写作业/平台,强烈建议遵循这三条:

  1. 任何 DDL/DML 执行前,显式 USE CATALOG + USE db

    避免默认的 default_catalog.default_database 导致表建错位置。

  2. 模块切换要谨慎 :USE MODULES hive 会导致 core 被禁用(不在列表里)

    如果你依赖 core 的函数或规则,记得把它放进列表里:

    sql 复制代码
    USE MODULES hive, core;
  3. 对外提供 SQL 执行能力时 :建议每个会话隔离上下文

    因为 USE 改的是"会话级的当前上下文",很容易造成串环境问题。

6、总结

  • USE CATALOG xxx:切换当前 catalog(默认 default_catalog)
  • USE db 或 USE catalog.db:切换当前数据库(默认 default_database)
  • USE MODULES ...:控制函数/类型/规则等元数据解析来源与优先级(默认模块 core)
  • 三者组合决定:你不写全限定名时,SQL 到底解析到哪里、函数到底用哪个实现
相关推荐
雨落在了我的手上1 分钟前
MySQL数据库基础(1):MySQL的安装-Windows
数据库·mysql
涉密IT资质笔记11 分钟前
涉密人员脱密期管理规范:期限分级模型、就业限制边界与违规认定标准
java·服务器·前端·网络·数据库
honsor18 分钟前
PoE温湿度传感器:一根网线供电+通信,即插即用,机房/配电室/仓库温湿度监测首选
运维·服务器·网络·数据库·人工智能·安全
XM_jhxx34 分钟前
简会AI图纸识别系统功能上新:模板、公差、量具个性化配置上线!
数据库·人工智能·软件工程
java资料站42 分钟前
十、向量数据库
数据库
Ivanqhz1 小时前
干涉图着色
java·服务器·网络·数据库·人工智能·深度学习
꯭自꯭闭꯭2 小时前
达梦DMDSC主备搭建
linux·服务器·数据库
用户EasyAdminBlazor2 小时前
EasyAdminBlazor 审批并发控制:两个人同时审批为什么只能成功一个?
数据库
杨云龙UP2 小时前
TDengine Community 超级表建表实战:统一21个TAG与DOUBLE/字符串数据模板
运维·服务器·数据库·时序数据库·tdengine·涛思数据·stable建表
katasea2 小时前
第05章:信创技术栈选型:服务器、操作系统、数据库、中间件适配对比
服务器·数据库·中间件