2012-12-18 82 views

回答

3

对于使用UDF,你需要两个步骤:

  1. 使可用于集群中的所有节点的UDF罐子。这通常是通过像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,你可以在hive-env.sh中使用类似export HIVE_AUX_JARS_PATH = <path to the folder>的东西来使得罐子可用。

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

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

2

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

Achyut

0

以上答案展开:为了真正使UDF的面世,要求所有用户/会话:

  • 添加UDF蜂巢库/目录和/或HIVE_AUX_JARS_PATH
  • 将函数添加到FunctionRegistry类并重新编译配置单元。是。不是那么好玩;)

从蜂巢圣经(编程蜂巢):

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

从蜂巢0.13起的UDF可以存储在metastore并且可以在查询中引用....

CREATE FUNCTION [DB_NAME。] function_name AS class_name [使用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';