Apache Presto 简明教程

Apache Presto - Custom Function Application

创建一个 Maven 项目来开发 Presto 自定义函数。

SimpleFunctionsFactory.java

创建 SimpleFunctionsFactory 类来实现 FunctionFactory 接口。

package com.tutorialspoint.simple.functions;

import com.facebook.presto.metadata.FunctionFactory;
import com.facebook.presto.metadata.FunctionListBuilder;
import com.facebook.presto.metadata.SqlFunction;
import com.facebook.presto.spi.type.TypeManager;
import java.util.List;

public class SimpleFunctionFactory implements FunctionFactory {

   private final TypeManager typeManager;
   public SimpleFunctionFactory(TypeManager typeManager) {
      this.typeManager = typeManager;
   }
    @Override

   public List<SqlFunction> listFunctions() {
      return new FunctionListBuilder(typeManager)
      .scalar(SimpleFunctions.class)
      .getFunctions();
   }
}

SimpleFunctionsPlugin.java

创建一个 SimpleFunctionsPlugin 类来实现 Plugin 接口。

package com.tutorialspoint.simple.functions;

import com.facebook.presto.metadata.FunctionFactory;
import com.facebook.presto.spi.Plugin;
import com.facebook.presto.spi.type.TypeManager;
import com.google.common.collect.ImmutableList;
import javax.inject.Inject;
import java.util.List;
import static java.util.Objects.requireNonNull;

public class SimpleFunctionsPlugin implements Plugin {
   private TypeManager typeManager;
   @Inject

   public void setTypeManager(TypeManager typeManager) {
      this.typeManager = requireNonNull(typeManager, "typeManager is null”);
      //Inject TypeManager class here
   }
   @Override

   public <T> List<T> getServices(Class<T> type){
      if (type == FunctionFactory.class) {
         return ImmutableList.of(type.cast(new SimpleFunctionFactory(typeManager)));
      }
      return ImmutableList.of();
   }
}

Add Resource File

创建一个在实现包中指定的资源文件。

(com.tutorialspoint.simple.functions.SimpleFunctionsPlugin)

然后移动到资源文件所在的位置 @ /path/to/resource/

然后添加这些更改,

com.facebook.presto.spi.Plugin

pom.xml

将以下这些依赖项添加到 pom.xml 文件。

<?xml version = "1.0"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0
    http://maven.apache.org/xsd/maven-4.0.0.xsd">

   <modelVersion>4.0.0</modelVersion>
   <groupId>com.tutorialspoint.simple.functions</groupId>
   <artifactId>presto-simple-functions</artifactId>
   <packaging>jar</packaging>
   <version>1.0</version>
   <name>presto-simple-functions</name>
   <description>Simple test functions for Presto</description>
   <properties>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
   </properties>
   <dependencies>
      <dependency>
         <groupId>com.facebook.presto</groupId>
         <artifactId>presto-spi</artifactId>
         <version>0.149</version>
      </dependency>
      <dependency>
         <groupId>com.facebook.presto</groupId>
         <artifactId>presto-main</artifactId>
         <version>0.149</version>
      </dependency>
      <dependency>
         <groupId>javax.inject</groupId>
         <artifactId>javax.inject</artifactId>
         <version>1</version>
      </dependency>
      <dependency>
         <groupId>com.google.guava</groupId>
         <artifactId>guava</artifactId>
         <version>19.0</version>
      </dependency>
   </dependencies>
   <build>
      <finalName>presto-simple-functions</finalName>
      <plugins>
      <!-- Make this jar executable -->
         <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>2.3.2</version>
         </plugin>
      </plugins>
   </build>
</project>

SimpleFunctions.java

使用 Presto 属性创建一个 SimpleFunctions 类。

package com.tutorialspoint.simple.functions;

import com.facebook.presto.operator.Description;
import com.facebook.presto.operator.scalar.ScalarFunction;
import com.facebook.presto.operator.scalar.StringFunctions;
import com.facebook.presto.spi.type.StandardTypes;
import com.facebook.presto.type.LiteralParameters;
import com.facebook.presto.type.SqlType;

public final class SimpleFunctions {
   private SimpleFunctions() {
   }

   @Description("Returns summation of two numbers")
   @ScalarFunction(“mysum")
   //function name
   @SqlType(StandardTypes.BIGINT)

   public static long sum(@SqlType(StandardTypes.BIGINT) long num1,
   @SqlType(StandardTypes.BIGINT) long num2) {
      return num1 + num2;
   }
}

在创建应用程序之后编译并执行该应用程序。它将生成 JAR 文件。复制该文件并将 JAR 文件移动到目标 Presto 服务器插件目录中。

Compilation

mvn compile

Execution

mvn package

现重启 Presto 服务器并连接 Presto 客户端。然后按照以下说明执行自定义函数应用程序,

$ ./presto --catalog mysql --schema default

Query

presto:default> select mysum(10,10);

Result

 _col0
-------
  20