美文网首页
Presto中UDF的使用 -- Plugin实现方式

Presto中UDF的使用 -- Plugin实现方式

作者: chenxk | 来源:发表于2019-04-17 11:01 被阅读0次

    本文主要是记录一下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  
    

    5.配置打包,在Presto Server配置的Plugin目录下面新建目录 cxk_udfs, 将Jar包放入,重启Server即可

    相关文章

      网友评论

          本文标题:Presto中UDF的使用 -- Plugin实现方式

          本文链接:https://www.haomeiwen.com/subject/omugwqtx.html