如何为所有会话创建一个蜂巢UDF?

最后发布: 2020-07-09


问题

我可以创建一个UDF,并为当前的hive会话配置它,使用的是 CREATE TEMPORARY FUNCTION. 有没有一种方法可以做到一次就能让所有用户的未来会话都能使用这个功能?

hive
回答

对于使用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中,这样就能让这些jars可用。

得到#2是很棘手的,最好的方法是在Hive元存储中支持UDF名称和类名之间的链接。然而,目前还没有这样的情况。所以,没有真正的好办法。

我推荐的是使用.hiverc文件,它可以同时实现上面的#1和#2。把它放在你的home目录或hive bin目录下(尽管有一个补丁也可以从hive conf目录中提取它)。唯一的问题是,只有当用户通过CLI访问hive时,它才能发挥作用。如果你使用的是JDBC,你必须在Hive会话开始时手动获取该文件。


回答

你能不能在以下位置找到一个.hiverc文件。$HIVE_HOMEbin.hiverc和$HOME.hiverc?如果你找到了,那么打开这个文件,在那里添加CREATE TEMPORARY FUNCTION命令即可。然后每次你启动hive时,这个.hiverc文件就会被加载,这样你的UDF就会在HIVE的所有会话中被regiseterd。

Achyut


回答

对上面的回答进行扩展:为了真正使UDF的对所有用户sessions都可用,需要。

  • 将UDF添加到hive libs目录和HIVE_AUX_JARS_PATH中。
  • 加入该函数 函数注册表 类并重新编译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);


回答

其中一个答案是... 如何在hive中添加一个永久函数? 指出,从Hive 13开始,就有一个CREATE FUNCTION功能,可用于永久函数,具体描述如下。https:/cwiki.apache.orgconfluencedisplayHiveLanguageManual+DDL#LanguageManualDDL-PermanentFunctions。.


回答

从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';