Hive 如何在配置单元中添加永久功能?

Hive 如何在配置单元中添加永久功能?,hive,user-defined-functions,Hive,User Defined Functions,问题是:如果我像这样在配置单元中声明一个临时函数: add jar /home/taobao/oplog/hivescript/my_udf.jar; create temporary function getContentValue as 'com.my.udf.GetContentValue'; 在这个配置单元会话中,它可以与函数getContentValue配合使用。但我想要的不是每次启动配置单元会话时都要添加jar以及创建临时函数。也就是说,使功能永久化 是否有解决此问题的方法?如果仅

问题是:如果我像这样在配置单元中声明一个
临时函数

add jar /home/taobao/oplog/hivescript/my_udf.jar;
create temporary function getContentValue as 'com.my.udf.GetContentValue';
在这个配置单元会话中,它可以与函数
getContentValue
配合使用。但我想要的不是每次启动配置单元会话时都要添加jar以及创建临时函数。也就是说,使功能永久化


是否有解决此问题的方法?

如果仅使用hive cli工具中的hive,则在中添加这两行应该可以:

在不使用-i选项的情况下调用CLI时,将尝试将$HIVE_HOME/bin/.hiverc和$HOME/.hiverc加载为初始化文件

如果您使用JDBC/ODBC连接到配置单元,那么您必须在应用程序代码中进行连接,例如,有一个连接工厂,它首先在连接中发出两个命令,然后再发出连接供应用程序使用

使临时UDF永久化(即将其与JAR一起存储在metastore中)目前是不可能的。这在技术上是可能的,但这是一个特性

从0.13.0()开始,您可以通过以下方式使自定义项永久化:

CREATE FUNCTION [db_name.]function_name AS class_name [USING JAR|FILE|ARCHIVE 'file_uri' [, JAR|FILE|ARCHIVE 'file_uri'] ]
您的UDF示例如下:

CREATE FUNCTION getContentValue AS 'com.my.udf.GetContentValue' USING JAR '/home/taobao/oplog/hivescript/my_udf.jar';
欲了解更多信息,请引用:

此语句允许您创建一个由类名实现的函数。需要添加到环境中的JAR、文件或归档可以通过USING子句指定;当配置单元会话第一次引用该函数时,这些资源将被添加到环境中,就像已发出addjar/FILE一样。如果配置单元未处于本地模式,则资源位置必须是非本地URI,如HDFS位置

函数将添加到指定的数据库中,或在创建函数时添加到当前数据库中。可以通过完全限定函数名(db_name.funciton_name)来引用函数,如果函数在当前数据库中,则可以不限定地引用函数


编写一个udf并制作它的jar。 为这样的UDF提供单独的用户是很好的。 将jar上载到此用户的hdfs位置

hdfs dfs -put <hive-udf>.jar /user/udf/
hive> use udf;
hive> CREATE FUNCTION RemoveNewLine AS 'com.mycompany.hive.udf.RemoveNewLine' USING JAR 'hdfs://<defaultFS>/user/udf/<hive-udf>.jar';
这对我很有用:

Add jar hdfs:/user/UID/UDF_Library/defValUDF.jar;
CREATE TEMPORARY FUNCTION defVal as 'defValUDF.DefValUDF';
select defval(client_id,"UNK"),
client_id
from fin.ic_table limit 20;
您可以将jar存储在hdfs中,修改权限,然后任何用户都可以使用这个UDF。“add jar”和“create temproary function”命令在一秒钟内执行

还发现:

1)将JAR文件存储在hdfs位置,而不是本地。如果我们已经创建了本地函数,我们可能需要使用一个新的函数名

2) 配置单元>使用JAR将函数掩码创建为“hiveudf.PI”hdfs://localhost:8020/user/cloudera/Mask.jar'; 在蜂箱壳里 注意:创建函数时,它会将JAR文件从HDFS移动到本地系统


有关更多信息,请访问

谢谢您的回答-关于JDBC/ODBC连接器的部分非常有用。你知道这是否仍然是不可能的吗-(要使jdbc连接器的永久udf可见),我没有找到任何有关此的详细信息。
udf。
SELECT udf.RemoveNewLine(url)
?或者简单地使用
选择RemoveneLine(url)
就可以了?
Add jar hdfs:/user/UID/UDF_Library/defValUDF.jar;
CREATE TEMPORARY FUNCTION defVal as 'defValUDF.DefValUDF';
select defval(client_id,"UNK"),
client_id
from fin.ic_table limit 20;