我可以创建一个 UDF 并使用CREATE TEMPORARY FUNCTION
. 有没有办法做到这一点,并让这个功能可用于所有用户的所有未来会话?
5 回答
要使用 UDF,您需要 2 个步骤:
- 使 UDF jar 可用于集群中的所有节点。这通常是通过以下命令将其添加到集群的分布式缓存中来完成的
ADD JAR my_jar.jar
- 注册您的 UDF,以便 Hive 可以识别它。这基本上将 UDF 的名称(例如 from_unixtime)与 UDF 的类(org.apache.hadoop.hive.ql.udf.FromUnixTime)联系起来。这通常由类似的命令完成
CREATE TEMPORARY FUNCTION from_unixtime AS 'org.apache.hadoop.hive.ql.udf.FromUnixTime';
因此,为了让所有用户都可以使用 UDF,您必须执行上述 2 个步骤。对于 #1,您可以export HIVE_AUX_JARS_PATH = <path to the folder>
在 hive-env.sh 中执行类似的操作,以使 jar 可用。
获得 #2 很棘手,最好的方法是在 Hive 元存储中支持 UDF 名称和类名称之间的链接。然而,目前情况并非如此。因此,没有真正的好方法可以做到这一点。
我建议使用 .hiverc 文件,它同时执行上面的 #1 和 #2。将它放在你的主目录或 hive bin 目录中(尽管一个补丁正在工作中以从 hive conf 目录中获取它)。唯一的问题是它仅在用户通过 CLI 访问 hive 时才有效。如果您使用的是 JDBC,则必须在 Hive 会话开始时手动获取该文件。
您能否在以下位置找到 .hiverc 文件:$HIVE_HOME/bin/.hiverc 和 $HOME/.hiverc?如果你找到一个然后打开文件并在那里添加你的 CREATE TEMPORARY FUNCTION 命令。然后每次启动 hive 时都会加载此 .hiverc 文件,因此您的 UDF 将被注册用于所有 HIVE 会话。
阿秋
Expanding on the above answers: in order to truly make UDF's available to all users/sessions it is required:
- add the UDF to the hive libs/ directory and/or HIVE_AUX_JARS_PATH
- add the function to the FunctionRegistry class and recompile hive. Yes. not so fun ;)
From the Hive Bible (Programming 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);
如何在 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';