Hive UDF创建:CREATE FUNCTION与CREATE TEMPORARY FUNCTION的区别
Hive 两类UDF创建语法的核心差异
两种创建语法的本质区别集中在生命周期、生效范围、元数据存储位置三个维度,具体差异如下:
- 持久化正式UDF(不带TEMPORARY关键字)
这类语句创建的是集群级公共函数,函数元数据会直接写入Hive的Metastore持久化存储:- 生效范围不受单会话限制,只要没有手动执行
DROP FUNCTION删除,不管是新建CLI连接、重启HiveServer2、还是切换其他有权限的账号登录,都可以直接调用这个函数 - 生产环境使用时必须在创建语句末尾关联对应的jar资源路径,完整写法参考:
CREATE FUNCTION country AS 'com.hiveudf.employeereview.Country' USING JAR 'hdfs:///opt/jars/hiveudf.jar';这种写法会在任务执行时自动从HDFS拉取对应jar包,不会出现集群节点找不到类的问题 - 注意:如果省略USING JAR的关联配置,Hive 2.0及以上版本无法正常完成持久化函数的创建流程
- 生效范围不受单会话限制,只要没有手动执行
- 会话级临时UDF(带TEMPORARY关键字)
这类语句创建的是仅当前会话可用的临时函数,完全不会写入Metastore的持久化存储:- 生效范围严格绑定当前Hive会话,一旦退出CLI、断开和HiveServer2的连接、或者会话因闲置超时被回收,这个函数就会自动失效,其他用户、其他新建的会话完全看不到这个临时函数
- 适合本地调试函数逻辑、单次临时跑数据清洗任务的场景,不需要手动清理残留定义,不会污染集群的公共函数列表
- 注意:如果当前会话里创建了和已有持久化UDF同名的临时函数,当前会话内会优先调用临时版本的函数逻辑
补充实操常见注意事项:
- 不管创建哪种类型的UDF,执行创建语句前都需要先运行
ADD JAR <本地或HDFS路径的jar包>,把对应依赖加入当前会话的类加载路径,否则会直接报找不到UDF实现类的错误- 项目内长期复用的数据整理函数,尽量创建为持久化UDF统一维护,不要每个任务会话手动重复创建临时UDF,避免出现函数版本不一致、漏加依赖的问题
内容的提问来源于stack exchange,提问作者Rishabh Tiwari
相关产品推荐
相关产品推荐

