2

我可以创建一个 UDF 并使用CREATE TEMPORARY FUNCTION. 有没有办法做到这一点,并让这个功能可用于所有用户的所有未来会话?

4

5 回答 5

3

要使用 UDF,您需要 2 个步骤:

  1. 使 UDF jar 可用于集群中的所有节点。这通常是通过以下命令将其添加到集群的分布式缓存中来完成的ADD JAR my_jar.jar
  2. 注册您的 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 会话开始时手动获取该文件。

于 2012-12-19T23:55:34.803 回答
2

您能否在以下位置找到 .hiverc 文件:$HIVE_HOME/bin/.hiverc 和 $HOME/.hiverc?如果你找到一个然后打开文件并在那里添加你的 CREATE TEMPORARY FUNCTION 命令。然后每次启动 hive 时都会加载此 .hiverc 文件,因此您的 UDF 将被注册用于所有 HIVE 会话。

阿秋

于 2013-07-18T07:45:27.850 回答
0

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);
于 2014-07-25T01:40:07.503 回答
0

如何在 hive 中添加永久功能的答案之一?指出自 Hive 13 以来,CREATE FUNCTION 功能可用于永久功能,如https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-PermanentFunctions所述。

于 2015-04-14T18:29:11.060 回答
0

从 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';
于 2015-07-16T08:21:34.347 回答