Apache-presto-custom-function-application

提供:Dev Guides
移動先:案内検索

Apache Presto-カスタム関数アプリケーション

Mavenプロジェクトを作成して、Prestoカスタム関数を開発します。

SimpleFunctionsFactory.java

FunctionFactoryインターフェイスを実装するSimpleFunctionsFactoryクラスを作成します。

package com.finddevguides.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クラスを作成します。

package com.finddevguides.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();
   }
}

リソースファイルを追加

実装パッケージで指定されているリソースファイルを作成します。

(com.finddevguides.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.finddevguides.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.finddevguides.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サーバープラグインディレクトリに移動します。

編集

mvn compile

実行

mvn package

次に、Prestoサーバーを再起動し、Prestoクライアントを接続します。 次に、以下で説明するカスタム関数アプリケーションを実行します。

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

問い合わせ

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

結果

 _col0
-------
  20