如何为所有会话创建配置单元 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的主要内容,如果未能解决你的问题,请参考以下文章

如何在配置单元中为结构字段创建视图

如何为多变量索引匹配公式创建 UDF

如何为Laravel中的每个会话设置不同的到期时间?

如何为数据框中的复杂列创建包含数组(案例类)的udf

如何为 grails 插件配置日志记录?

运行 sql 时配置单元 UDF 如何运行?