如何为所有会话创建配置单元 UDF
Posted
技术标签:
【中文标题】如何为所有会话创建配置单元 UDF【英文标题】:how to create a hive UDF for all sessions 【发布时间】:2012-12-18 19:55:57 【问题描述】:我可以创建一个 UDF 并使用 CREATE TEMPORARY FUNCTION
为当前配置单元会话配置它。有没有办法做到这一点,并让所有用户的所有未来会话都可以使用此功能?
【问题讨论】:
【参考方案1】:要使用 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,您可以在 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 会话开始时手动获取该文件。
【讨论】:
【参考方案2】:你能在 $HIVE_HOME/bin/.hiverc 和 $HOME/.hiverc 等位置找到 .hiverc 文件吗?如果你找到一个然后打开文件并在那里添加你的 CREATE TEMPORARY FUNCTION 命令。然后每次启动 hive 时都会加载此 .hiverc 文件,因此您的 UDF 将为所有 HIVE 会话注册。
阿秋
【讨论】:
【参考方案3】:扩展上述答案:为了真正使 UDF 可供所有用户/会话使用,它是必需的:
将 UDF 添加到 hive libs/ 目录和/或 HIVE_AUX_JARS_PATH 将函数添加到 FunctionRegistry 类并重新编译 hive。是的。没那么有趣;)来自 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);
【讨论】:
【参考方案4】:how to add a permanent function in hive? 中的一个答案指出,自 Hive 13 以来,有一个可用于永久功能的 CREATE FUNCTION 功能,如https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-PermanentFunctions 所述。
【讨论】:
【参考方案5】:从 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';
【讨论】:
以上是关于如何为所有会话创建配置单元 UDF的主要内容,如果未能解决你的问题,请参考以下文章