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

Hive 如何为所有会话创建配置单元UDF,hive,Hive,我可以创建一个UDF,并使用create TEMPORARY FUNCTION为当前配置单元会话配置它。是否有一种方法可以一次性完成此操作并使此功能可用于所有用户的所有未来会话?要使用UDF,需要两个步骤: 使UDF jar可用于集群中的所有节点。这通常是通过像addjarmy_JAR.JAR这样的命令将其添加到集群的分布式缓存中来完成的 注册您的UDF,以便Hive能够识别它。这基本上将UDF的名称(例如from_unixtime)与UDF的类(org.apache.hadoop.hive.q

我可以创建一个UDF,并使用
create TEMPORARY FUNCTION
为当前配置单元会话配置它。是否有一种方法可以一次性完成此操作并使此功能可用于所有用户的所有未来会话?

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

  • 使UDF jar可用于集群中的所有节点。这通常是通过像
    addjarmy_JAR.JAR这样的命令将其添加到集群的分布式缓存中来完成的
  • 注册您的UDF,以便Hive能够识别它。这基本上将UDF的名称(例如from_unixtime)与UDF的类(org.apache.hadoop.hive.ql.UDF.FromUnixTime)链接起来。这通常是通过像
    CREATE TEMPORARY FUNCTION from_unixtime作为'org.apache.hadoop.hive.ql.udf.FromUnixTime'这样的命令来完成的
  • 因此,为了使UDF对所有用户都可用,您必须执行上述两个步骤。对于#1,您可以在HIVE-env.sh中执行类似于导出蜂箱_AUX_JARS_PATH=的操作,以使jar可用

    获取#2很棘手,最好的方法是在配置单元元存储中提供支持,在UDF名称和类名之间建立链接。然而,目前情况并非如此。因此,没有真正好的方法来做到这一点


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

    能否在以下位置找到.hiverc文件:$Hive\u HOME/bin/.hiverc和$HOME/.hiverc?如果您找到了一个,那么打开该文件并在其中添加您的createtemporary函数命令。然后,每次启动配置单元时,都会加载此.hiverc文件,因此将为配置单元的所有会话注册UDF


    Achyut

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

    • 将UDF添加到配置单元libs/目录和/或配置单元AUX\u JARS\u路径
    • 将函数添加到FunctionRegistry类并重新编译配置单元。对不那么有趣;)
    来自蜂巢圣经(编程蜂巢):


    中的一个答案指出,自Hive 13以来,有一个创建函数功能可用于永久函数,如中所述

    从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';
    
    CREATE FUNCTION woy AS 'com.udf.hive.WOYUDF' USING JAR 'hdfs:///user/root/udfhive-1.0-SNAPSHOT.jar';