本文主要是记录一下Presto实现Udf的过程,话不多说,下面见详细使用步骤
1. 创建Maven工程,添加Maven依赖(ps:创建maven工程的步骤省略,可以自行查找案例)
<?xml version="1.0" encoding="UTF-8"?>
<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.cxk</groupId>
<artifactId>dssp-udfs</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<presto.version>0.215</presto.version>
<slice.version>0.15</slice.version>
<presto.plugin.version>0.3</presto.plugin.version>
<guava.version>18.0</guava.version>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/io.prestosql/presto-spi -->
<dependency>
<groupId>com.facebook.presto</groupId>
<artifactId>presto-spi</artifactId>
<version>${presto.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.facebook.presto</groupId>
<artifactId>presto-main</artifactId>
<version>${presto.version}</version>
</dependency>
<dependency>
<groupId>io.airlift</groupId>
<artifactId>slice</artifactId>
<version>${slice.version}</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>${guava.version}</version>
</dependency>
<dependency>
<groupId>xerces</groupId>
<artifactId>xercesImpl</artifactId>
<version>2.9.1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-release-plugin</artifactId>
<version>2.5.1</version>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
2.编写Function,注意要用注解声明Function的相关信息,并且 参数也要注解声明
package com.cxk.functions;
import com.facebook.presto.spi.function.Description;
import com.facebook.presto.spi.function.ScalarFunction;
import com.facebook.presto.spi.function.SqlType;
import com.facebook.presto.spi.type.StandardTypes;
import io.airlift.slice.Slice;
import io.airlift.slice.Slices;
public class LowerFunction {
@ScalarFunction("lower_cxk") --查询中使用到的function名字
@Description("hive to_date function") --show functions 的时候显示的function备注
@SqlType(StandardTypes.VARCHAR) --返回值类型
public static Slice lower_cxk(@SqlType(StandardTypes.VARCHAR) Slice input) {
String argument = input.toStringUtf8();
return Slices.utf8Slice(argument.toLowerCase());
}
}
3.编写Plugin,主要是注册Function
package com.cxk.plugin;
import com.facebook.presto.spi.Plugin;
import com.google.common.collect.ImmutableSet;
import com.cxk.functions.*;
import java.util.Set;
public class DsspPlugin implements Plugin {
public Set<Class<?>> getFunctions()
{
return ImmutableSet.<Class<?>>builder()
.add(LowerFunction.class)
.build();
}
}
4.编写配置文件,Presto 会使用ServiceLoader 加载Plugin信息,所以需要一下步骤实现配置
在resources目录下面添加 META-INF/service目录
新建一个文件,命名为com.facebook.presto.spi.Plugin
在文件中添加以下内容:com.cxk.plugin.DsspPlugin
网友评论