【问题标题】:What are the steps to plugin UDF function into Presto?将 UDF 功能插入 Presto 的步骤是什么?
【发布时间】:2019-04-27 15:52:49
【问题描述】:

我遵循this 教程并利用this github 项目编写了一个简单的“mysum”UDF 函数。

@ScalarFunction("mysum")
@Description("Returns summation of two numbers")
@SqlType(StandardTypes.BIGINT)
public static long sum(@SqlType(StandardTypes.BIGINT) long num1, @SqlType(StandardTypes.BIGINT) long num2)
{
    return num1 + num2;
}

我按照以下步骤插入 UDF,但 Presto 无法导入该函数。 由于关于编写和插入 UDF 的文档很少,任何帮助将不胜感激。提前致谢。

  1. 运行mvn compilemvn package
  2. .jar文件复制到presto(解压缩)目录/Users/nithin/presto-server-0.166/plugin/udfs/下的plugins文件夹中
  3. 使用bin/launcher run启动协调器 在 Presto CLI 中运行 select mysum(10,100),但抛出错误

以下是我尝试在 Presto CLI 中运行我的 UDF ('mysum') 时的错误日志。 很明显 Presto 找不到 UDF,所以插入不成功。如何解决?我是否缺少任何步骤?

➜  Workspaces ./presto.jar --server localhost:8080 --catalog mysql --schema default --debug
presto:default> select mysum(99,100);
Query 20170228_183509_00002_vr5dt failed: line 1:8: Function mysum not registered
com.facebook.presto.sql.analyzer.SemanticException: line 1:8: Function mysum not registered
    at com.facebook.presto.sql.analyzer.ExpressionAnalyzer$Visitor.visitFunctionCall(ExpressionAnalyzer.java:824)
    at com.facebook.presto.sql.analyzer.ExpressionAnalyzer$Visitor.visitFunctionCall(ExpressionAnalyzer.java:255)
    at com.facebook.presto.sql.tree.FunctionCall.accept(FunctionCall.java:111)
    at com.facebook.presto.sql.tree.StackableAstVisitor.process(StackableAstVisitor.java:26)
    at com.facebook.presto.sql.analyzer.ExpressionAnalyzer$Visitor.process(ExpressionAnalyzer.java:274)
    at com.facebook.presto.sql.analyzer.ExpressionAnalyzer.analyze(ExpressionAnalyzer.java:231)
    at com.facebook.presto.sql.analyzer.ExpressionAnalyzer.analyzeExpression(ExpressionAnalyzer.java:1406)
    at com.facebook.presto.sql.analyzer.StatementAnalyzer.analyzeExpression(StatementAnalyzer.java:1802)
    at com.facebook.presto.sql.analyzer.StatementAnalyzer.analyzeSelect(StatementAnalyzer.java:1623)
    at com.facebook.presto.sql.analyzer.StatementAnalyzer.visitQuerySpecification(StatementAnalyzer.java:800)
    at com.facebook.presto.sql.analyzer.StatementAnalyzer.visitQuerySpecification(StatementAnalyzer.java:188)
    at com.facebook.presto.sql.tree.QuerySpecification.accept(QuerySpecification.java:127)
    at com.facebook.presto.sql.tree.AstVisitor.process(AstVisitor.java:27)
    at com.facebook.presto.sql.analyzer.StatementAnalyzer.visitQuery(StatementAnalyzer.java:550)
    at com.facebook.presto.sql.analyzer.StatementAnalyzer.visitQuery(StatementAnalyzer.java:188)
    at com.facebook.presto.sql.tree.Query.accept(Query.java:94)
    at com.facebook.presto.sql.tree.AstVisitor.process(AstVisitor.java:27)
    at com.facebook.presto.sql.analyzer.Analyzer.analyze(Analyzer.java:68)
    at com.facebook.presto.sql.analyzer.Analyzer.analyze(Analyzer.java:60)
    at com.facebook.presto.execution.SqlQueryExecution.doAnalyzeQuery(SqlQueryExecution.java:290)
    at com.facebook.presto.execution.SqlQueryExecution.analyzeQuery(SqlQueryExecution.java:276)
    at com.facebook.presto.execution.SqlQueryExecution.start(SqlQueryExecution.java:234)
    at com.facebook.presto.execution.QueuedExecution.lambda$start$1(QueuedExecution.java:63)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
select mysum(99,100)

【问题讨论】:

    标签: udf presto


    【解决方案1】:

    您的连接器插件应提供 UDF 类的列表。见Plugin#getFunctions

    default Set<Class<?>> getFunctions()
    {
        return emptySet();
    }
    

    请重写方法并暴露UDF类的类。

    【讨论】:

      【解决方案2】:

      我通常更喜欢在本地构建 presto UDF jar 并尝试在 dockerized presto 集群上安装以确保它安装成功。

      我使用 gradle 构建了我的 jar,并在 presto Foundation 启动后使用了最新的模块作为依赖项。在 maven 中,meta-inf/services 中的文件是自动创建的,在 gradle 中我必须手动设置它。

      这里是 github 存储库和本地测试 UDF 的步骤。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-01-09
        • 2010-12-29
        • 2017-05-17
        • 2023-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多