如何为所有会话创建配置单元UDF

时间:2012-12-18 19:55:57

标签: hive

我可以使用CREATE TEMPORARY FUNCTION创建一个UDF并为当前的配置单元会话配置它。有没有办法做到这一点,并为所有用户的所有未来会话提供此功能?

5 个答案:

答案 0 :(得分:3)

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

  1. 使UDF jar可用于群集中的所有节点。这通常通过像ADD JAR my_jar.jar
  2. 这样的命令将其添加到集群的分布式缓存中来完成
  3. 注册您的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';
  4. 之类的命令完成

    因此,为了让UDF可供所有用户使用,您必须执行上述两个步骤。对于#1,您可以在hive-env.sh中执行类似export HIVE_AUX_JARS_PATH = <path to the folder>的操作,这样可以使jar可用。

    获取#2非常棘手,最好的方法是在Hive Metastore中支持UDF名称和类名之间的链接。但是,目前情况并非如此。所以,没有真正好的方法。

    我建议使用.hiverc文件,该文件同时执行#1和#2。将它放在您的主目录或hive bin目录中(尽管补丁正在从hive conf目录中获取它)。唯一的问题是它只在用户通过CLI访问配置单元时才有效。如果您使用的是JDBC,则必须在Hive会话开始时手动获取该文件。

答案 1 :(得分:2)

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

Achyut

答案 2 :(得分:0)

扩展上述答案:为了真正使所有用户/会话都能使用UDF,需要:

  • 将UDF添加到hive libs /目录和/或HIVE_AUX_JARS_PATH
  • 将该函数添加到 FunctionRegistry 类并重新编译配置单元。是。不那么有趣;)

来自Hive Bible(编程蜂巢):

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);

答案 3 :(得分:0)

how to add a permanent function in hive?中的一个答案指出,由于Hive 13有一个CREATE FUNCTION功能可用于永久功能,如https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-PermanentFunctions所述。

答案 4 :(得分:0)

从hive .13开始,UDF可以存储在Metastore中,可以在查询中引用....

CREATE FUNCTION [db_name。] function_name AS class_name   [使用JAR |文件|存档&#39; file_uri&#39; [,JAR | FILE | ARCHIVE&#39; file_uri&#39;]];

示例:

创建功能woy AS&#39; com.udf.hive.WOYUDF&#39;使用JAR&#39; hdfs:///user/root/udfhive-1.0-SNAPSHOT.jar' ;;