开发自定义的dremio 函数

dremio 自定义函数的开发与drill 模式是一样的,以下是一个简单demo

预备

dremio 一些核心的功能都是在 dremio-sabot-kernel 中的,可以看看源码还是比较有用的

项目结构

项目主要是创建一个uuid 的函数

  • 项目结构
├── pom.xml
├── src
├── main
├── java
└── com
└── dalong
└── udf
└── MyFunc.java
└── resources
└── sabot-module.conf
 
  • pom.xml
    注意需要配置maven-source-plugin 插件
 
<?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.dalong</groupId>
    <artifactId>dremio-func</artifactId>
    <version>1.2-SNAPSHOT</version>
 
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <version.dremio>13.0.0-202101272034330307-20fb9275</version.dremio>
    </properties>
 
    <dependencies>
        <dependency>
            <groupId>com.dremio.sabot</groupId>
            <artifactId>dremio-sabot-kernel</artifactId>
            <version>${version.dremio}</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
 
    <repositories>
        <repository>
            <id>dremio-free</id>
            <url>http://maven.dremio.com/free/</url>
        </repository>
        <repository>
            <id>dremio-public</id>
            <url>http://maven.dremio.com/public/</url>
        </repository>
    </repositories>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-source-plugin</artifactId>
                <version>3.2.1</version>
                <executions>
                    <execution>
                        <id>attach-sources</id>
                        <phase>package</phase>
                        <goals>
                            <goal>jar-no-fork</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>
  • sabot-module.conf
    老样子,dremio 开发的jar 包都依赖的
 
dremio.classpath.scanning.packages += com.dalong.udf
  • MyFunc.java
    核心关于函数部分
 
package com.dalong.udf;
import com.dremio.exec.expr.SimpleFunction;
import com.dremio.exec.expr.annotations.FunctionTemplate;
import com.dremio.exec.expr.annotations.Output;
import com.dremio.exec.expr.annotations.Param;
import com.dremio.exec.expr.fn.FunctionErrorContext;
import org.apache.arrow.memory.ArrowBuf;
import org.apache.arrow.vector.holders.IntHolder;
import org.apache.arrow.vector.holders.VarCharHolder;
import javax.inject.Inject;
 
@FunctionTemplate(names = {"mychar_len"},desc = "char length",scope = FunctionTemplate.FunctionScope.SIMPLE,nulls = FunctionTemplate.NullHandling.NULL_IF_NULL )
public class MyFunc implements SimpleFunction {
    @Param
    VarCharHolder input;
 
    @Output
    IntHolder out;
 
    @Inject
    FunctionErrorContext errCtx;
 
    @Override
    public void setup() {
    }
    @Override
    public void eval() {
         // 需要使用完整的包名,同时使用了dremio内部包装的函数
        out.value = com.dremio.exec.expr.fn.impl.StringFunctionUtil.getUTF8CharLength(io.netty.buffer.NettyArrowBuf.unwrapBuffer(input.buffer),
                input.start, input.end, errCtx);
    }
}

参考使用

基于docker 运行的,注意需要放jars 目录,同时需要包含带有源码的jar

  • docker 文件
FROM dremio/dremio-oss:13.0
COPY demodremio-driver-1.2-SNAPSHOT.jar /opt/dremio/jars/
COPY dremio-func-1.2-SNAPSHOT.jar /opt/dremio/jars/
COPY dremio-func-1.2-SNAPSHOT-sources.jar /opt/dremio/jars/
  • 使用效果

 

 

说明

注意顺序以及位置,同时maven-source-plugin 也是很重要的,这点demio 与drill 是一样的需要包含源码文件

参考资料

https://github.com/dremio-hub/dremio-internal-function-example
https://drill.apache.org/docs/custom-function-interfaces/

posted on   荣锋亮  阅读(399)  评论(0编辑  收藏  举报

编辑推荐:
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· spring官宣接入deepseek,真的太香了~
历史上的今天:
2020-02-11 griddb java 应用连接配置
2020-02-11 griddb 集群简单学习
2020-02-11 pgspider redis fdw pub && sub 试用
2020-02-11 pgspider redis fdw 试用
2018-02-11 fabio 安装试用&&实际使用的几个问题
2018-02-11 yugabyte cloud native db 基本试用
2017-02-11 Traefik 服务发现解决方案

导航

< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8
点击右上角即可分享
微信分享提示