【问题标题】:Hive UDF that uses Hive table使用 Hive 表的 Hive UDF
【发布时间】:2016-01-27 06:15:01
【问题描述】:

我在java中开发了一个可以正常工作的hive udf,我的函数返回输入和hive表中的列之间的最佳匹配,所以它有这个简化的伪代码:

class myudf  extends udf{

    evaluate(Text input){

        getNewHiveConnection(); //i want to replace this by getCurrentHiveUserConnetion();
        executeHiveQuery(input);
        return something;
}

我的问题是,如果 Hive 调用了这个函数,为什么我需要在我的代码中连接到 hive?我可以使用使用我的功能的用户连接的当前连接吗?

【问题讨论】:

  • @54I3d 你运气好吗?
  • @Giri 我采用了另一种解决方案,我将表数据作为属性文件包含到 jar 文件中。由于文件太小,它工作得如此之快,但我需要在更新表格时更新 jar!

标签: java hive user-defined-functions


【解决方案1】:

另一种方法是创建宏。他们在 Hive 和 Beeline 上都工作。

CREATE TEMPORARY MACRO fn_maskNull(input decimal(25,3))
CASE
    WHEN input IS NULL THEN 0 else input
END;

-- usage
select fn_maskNull(null), fn_maskNull(101);

更多信息:

https://medium.com/@gchandra/create-user-defined-functions-in-hive-beeline-ff965285d735

【讨论】:

  • 它在java中需要它,因为它实现了一个复杂的逻辑,问题被简化为专注于解决方案。谢谢!
【解决方案2】:

如果您想从查询中的整个列返回最接近的匹配项,您可以将其视为某种聚合并使用 Hive UDAF: https://cwiki.apache.org/confluence/display/Hive/GenericUDAFCaseStudy

还有很方便的教程: http://beekeeperdata.com/posts/hadoop/2015/08/17/hive-udaf-tutorial.html

【讨论】:

    【解决方案3】:

    是的 - 您可以将 UDF 设为永久。例如:

    CREATE FUNCTION MatchFinder as 'com.mycompany.packagex.myudf' using jar  'hdfs:///an_HDFS_directory/my_jar_name.jar';
    

    这将使您的函数永久化,任何人都可以调用它。在这种情况下,jar 文件存储在 HDFS 上以便于访问,但还有其他选项。

    更多详情请见Hive wiki

    【讨论】:

    • 这不是我要找的,我想使用调用我的 udf 的用户使用的当前连接,而不是创建新连接,只是为了让它更快。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-12
    相关资源
    最近更新 更多