【发布时间】:2012-12-18 19:55:57
【问题描述】:
我可以创建一个 UDF 并使用 CREATE TEMPORARY FUNCTION 为当前配置单元会话配置它。有没有办法做到这一点,并让所有用户的所有未来会话都可以使用此功能?
【问题讨论】:
标签: hive
我可以创建一个 UDF 并使用 CREATE TEMPORARY FUNCTION 为当前配置单元会话配置它。有没有办法做到这一点,并让所有用户的所有未来会话都可以使用此功能?
【问题讨论】:
标签: hive
要使用 UDF,您需要 2 个步骤:
ADD JAR my_jar.jar 的命令将其添加到集群的分布式缓存中来完成
CREATE TEMPORARY FUNCTION from_unixtime AS 'org.apache.hadoop.hive.ql.udf.FromUnixTime'; 之类的命令完成
因此,为了让所有用户都可以使用 UDF,您必须执行上述 2 个步骤。对于 #1,您可以在 hive-env.sh 中执行类似 export HIVE_AUX_JARS_PATH = <path to the folder> 的操作,这将使 jar 可用。
获得#2 很棘手,最好的方法是在 Hive 元存储中支持 UDF 名称和类名称之间的链接。然而,目前情况并非如此。因此,没有真正的好方法可以做到这一点。
我建议使用 .hiverc 文件,该文件同时执行上述 #1 和 #2。将它放在你的主目录或 hive bin 目录中(尽管补丁正在工作中以从 hive conf 目录中获取它)。唯一的问题是它仅在用户通过 CLI 访问 hive 时才有效。如果您使用的是 JDBC,则必须在 Hive 会话开始时手动获取该文件。
【讨论】:
你能在 $HIVE_HOME/bin/.hiverc 和 $HOME/.hiverc 等位置找到 .hiverc 文件吗?如果你找到一个然后打开文件并在那里添加你的 CREATE TEMPORARY FUNCTION 命令。然后每次启动 hive 时都会加载此 .hiverc 文件,因此您的 UDF 将为所有 HIVE 会话注册。
阿秋
【讨论】:
扩展上述答案:为了真正使 UDF 可供所有用户/会话使用,它是必需的:
来自 Hive 圣经(编程 Hive):
Here is an example change to FunctionRegistry where the new nvl() function is added
to Hive’s list of built-in functions:
...
registerUDF("parse_url", UDFParseUrl.class, false);
【讨论】:
how to add a permanent function in hive? 中的一个答案指出,自 Hive 13 以来,有一个可用于永久功能的 CREATE FUNCTION 功能,如https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-PermanentFunctions 所述。
【讨论】:
从 hive 0.13 开始,UDF 可以存储在 Metastore 中,并且可以在查询中引用
CREATE FUNCTION [db_name.]function_name AS class_name
[USING JAR|FILE|ARCHIVE 'file_uri' [, JAR|FILE|ARCHIVE 'file_uri'] ];
例子:
CREATE FUNCTION woy AS 'com.udf.hive.WOYUDF' USING JAR 'hdfs:///user/root/udfhive-1.0-SNAPSHOT.jar';
【讨论】: