C++类型转换机制详解
2026/5/22 20:51:32
一句话总结:
LOAD MODULE用来把某个模块加载进会话,让 Flink 能在后续 SQL 解析/执行时使用该模块提供的能力(例如 Hive 模块提供的 Hive 系列函数、兼容能力等)。
你可以把它理解为“给 SQL 引擎装插件”。
在 Java(TableEnvironment/StreamTableEnvironment)里直接执行:
tEnv.executeSql("LOAD MODULE hive WITH ('hive-version' = '3.1.3')");OK加载完用SHOW MODULES看一下是否生效:
tEnv.executeSql("SHOW MODULES").print();你会看到默认的core+ 新加载的hive:
+-------------+ | module name | +-------------+ | core | | hive | +-------------+语法:
LOADMODULE module_name[WITH('key1'='val1','key2'='val2',...)]这里最关键有两点:
module_name必须与 module factory 中定义的模块类型一致这意味着:你写错一个字母大小写,都可能导致“找不到模块”。
WITH (...)是一个 key-value maptype这个 key 不能放,其它 key-value 可以作为配置传入示例里:
LOADMODULE hiveWITH('hive-version'='3.1.3')就是在告诉 hive 模块:你要按 3.1.3 这个 Hive 版本来做兼容加载/初始化。
在真实项目中,模块通常要配合另外两类语句一起用,形成闭环:
LOADMODULE hiveWITH('hive-version'='3.1.3');SHOWFULLMODULES;你会看到模块是否 used=true/false(启用状态)以及解析顺序信息。
USEMODULES hive,core;很多人只 LOAD,不 USE;结果函数解析还是走 core,或者执行
USE MODULES hive后导致 core 被禁用,引发“某些函数突然不可用”。
所以建议:LOAD 之后用 SHOW FULL MODULES 看状态,再用 USE MODULES 固化顺序。
原因常见是:模块加载了但没按预期启用/排序。
排查:
SHOWFULLMODULES;如果 hive 是 used=false,或者解析顺序不对,就用:
USEMODULES hive,core;表现:直接异常,提示找不到模块/无法发现模块。
处理:确认 module_name 与 factory 定义一致,例如hive就写hive。
比如 hive 模块通常需要hive-version这种关键参数。
处理:按模块要求补齐参数(你给的示例就是正确姿势)。
LOAD MODULE:用于加载内置或自定义模块executeSql()执行,成功返回OKmodule_name大小写敏感,并用于模块发现WITH (...)配置会传给 discovery service 用于实例化模块(排除 key=type)