将UDF函数插入Presto的步骤是什么?

时间:2017-02-28 18:18:53

标签: udf presto

我按照this教程并利用this github项目写了一个简单的神秘故事' 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/
  3. 下的plugins文件夹中
  4. 使用bin/launcher run启动协调员 在Presto CLI中运行select mysum(10,100),但抛出错误
  5. 当我尝试在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)
    

2 个答案:

答案 0 :(得分:0)

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

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

请覆盖该方法并公开UDF类的类。

答案 1 :(得分:0)

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

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

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