TEMPORARY FUNCTION 的作用域仅在当前会话中,重新进入 hive,或者重新连接 HiveServer2,需要重新创建。
ADD JAR pathOfJar; --路径可以是 hdfs 或者 本地文件DROp FUNCTION IF EXISTS functionName;CREATE TEMPORARY FUNCTION functionName AS 'com.xxx.xxx.ClassName';
使用方法
select functionName(parameters) from table_name.
PERSISTENT FUNCTION(持久函数) 持久函数的作用域是全局的,在一个会话创建的持久函数,在其他会话可以看到。持久函数的信息存储在 metaStore后端数据库里,所以重启 Hive 环境,重启 HiveServer 或者重启 metaStore 都不影响持久函数的使用。
持久函数属于一个数据库,不同的数据库可以有相同名称的持久函数。
利用 hive 已有的 class 做示例,用户可以上传自己的 jar 包。
hadoop fs -mkdir -p hdfs://localhost:9000/apps/hive/hadoop fs -put /usr/local/hive/lib/hive-exec-3.1.2.jar hdfs://localhost:9000/apps/hive/
创建持久函数create function tpcds_hdfs_orc_3.length_u as 'org.apache.hadoop.hive.ql.udf.generic.GenericUDFLength' using jar 'hdfs://localhost:9000/apps/hive/hive-exec-3.1.2.jar';
使用持久函数如果在持久函数所在的数据库,直接使用。
select length_u(web_name) from web_site;
如果不在持久函数所在的数据库,持久函数前面需要加上数据库前缀。
select tpcds_hdfs_orc_3.length_u(web_name) from web_site;
持久函数在 metaStore 数据库中存储信息持久函数的基本信息存储在 FUNCS 表中。
mysql> select * from metastore.FUNCS;+---------+--------------------------------------------------------+-------------+-------+------------------+-----------+------------+------------+| FUNC_ID | CLASS_NAME | CREATE_TIME | DB_ID | FUNC_NAME | FUNC_TYPE | OWNER_NAME | OWNER_TYPE |+---------+--------------------------------------------------------+-------------+-------+------------------+-----------+------------+------------+| 1 | org.apache.hadoop.hive.ql.udf.generic.GenericUDFLength | 1644303366 | 5 | genericudflength | 1 | NULL | USER |+---------+--------------------------------------------------------+-------------+-------+------------------+-----------+------------+------------+1 row in set (0.00 sec)
持久函数的 Jar 包位置信息存储在 FUNC_RU 表中。
mysql> select * from metastore.FUNC_RU;+---------+---------------+-----------------------------------------------------+-------------+| FUNC_ID | RESOURCE_TYPE | RESOURCE_URI | INTEGER_IDX |+---------+---------------+-----------------------------------------------------+-------------+| 1 | 1 | hdfs://localhost:9000/apps/hive/hive-exec-3.1.2.jar | 0 |+---------+---------------+-----------------------------------------------------+-------------+1 row in set (0.00 sec)
RESOURCE_TYPE 对应 ResourceType 枚举的值。
public enum ResourceType implements org.apache.thrift.TEnum { JAR(1), FILE(2), ARCHIVE(3); private final int value; private ResourceType(int value) { this.value = value; }}