MRS3.1.1-LTS版本 HetuEngine新特性: Local UDF, remote UDF初体验

HetuEngine九级代言 发表于 2021/07/02 14:37:19 2021/07/02
【摘要】 MRS3.1.1-LTS版HetuEngine新特性: 新增UDF SQL语法,支持Remote UDF计算下推. 是跨源跨域解决方案的关键部分,满足无限膨胀的第三方异构数据源UDF匹配需求. 同时, 在使用新语法CREATE/DROP FUNCTION语法后,不需要重启任何的服务或者计算集群就能生效, 减少使用的成本。

MRS3.1.1-LTS版HetuEngine新特性:

新增UDF SQL语法,支持Remote UDF计算下推. 是跨源跨域解决方案的关键部分,满足无限膨胀的第三方异构数据源UDF匹配需求. 同时, 在使用新语法CREATE/DROP FUNCTION语法后,不需要重启任何的服务或者计算集群就能生效, 减少使用的成本。


1. Local UDF

Local UDF指的就是在HetuEngine计算集群内执行的UDF, 目前仅支持Java语义定义的UDF. 


1.1 编写Java类型用户定义函数

在开始函数开发之前,需要了解:


  1. 确保Maven已导入Hive UDF的“hive-exec”依赖,建议依赖的版本为3.1.1及以上。
  2. 函数参数从SQL到UDF代码时,可能会存在数据类型差异。例如,在UDF代码中,您可能会更清楚不同类型的整数需要多少字节。
  3. 仔细选择参数,避免副作用,让每个函数做一件事情,等等。

编码入门



  • pom文件导入依赖。



-
Xml 代码
01 <dependency>
02 <groupId>org.apache.hive</groupId>
03 <artifactId>hive-exec</artifactId>
04 <version>3.1.1</version>
05 <exclusions>
06 <exclusion>
07 <groupId>*</groupId>
08 <artifactId>*</artifactId>
09 </exclusion>
10 </exclusions>
11 </dependency>

  • 编写样例代码。
-
Java 代码
1 package com.huawei.bigdata.hetuengine.functions;
2 import org.apache.hadoop.hive.ql.exec.UDF;
3 public class AddTwo extends UDF {
4 public Integer evaluate(Integer num) {
5 return ++num;
6 }
7 }
  • 编译时采用Maven插件将所有的依赖构建为一个JAR包。
-
Xml 代码
01 <plugin>
02 <artifactId>maven-assembly-plugin</artifactId>
03 <configuration>
04 <appendAssemblyId>false</appendAssemblyId>
05 <descriptorRefs>
06 <descriptorRef>jar-with-dependencies</descriptorRef>
07 </descriptorRefs>
08 </configuration>
09 <executions>
10 <execution>
11 <id>make-assembly</id>
12 <phase>package</phase>
13 <goals>
14 <goal>single</goal>
15 </goals>
16 </execution>
17 </executions>
18 </plugin>
HetuEngine从HDFS位置加载函数JAR文件。在构建包含一个或多个函数的JAR文件后,可使用HDFS的Web UI新建文件夹,上传JAR文件。或使用hdfs dfs将JAR文件复制到可由HetuEngine读取的HDFS位置。例如:将JAR文件上传到HetuEngine所在集群HDFS的“/udf/user1”目录。
-
Bash 代码
1 hdfs dfs -put functions-1.0.jar /udf/user1/
2 hdfs dfs -chmod 644 /udf/user1/functions-1.0.jar
  • 创建一个新的JAVA函数“hetu.default.add_two”
进入Hetu-Cli
-
Sql 代码
1 CREATE FUNCTION example.namespace02.repeat (
2 str VARCHAR,
3 times BIGINT
4 )
5 RETURNS VARCHAR
6 LANGUAGE JDBC
7 SPECIFIC repeat
8 DETERMINISTIC;
9 select hetu.default.add_two(2);


2. Remote UDF

remote UDF 指的是不在HetuEngine侧执行, 而是将定义的UDF下推到数据源中执行, 举个MPPDB的例子。

-
Sql 代码
01 CREATE FUNCTION example.namespace02.repeat (
02 str VARCHAR,
03 times BIGINT
04 )
05 RETURNS VARCHAR
06 LANGUAGE JDBC
07 SPECIFIC repeat
08 DETERMINISTIC;
09 --执行函数
10 select example.namespace02.repeat(t1.name,3) from mppdb.test.table1 t1;


注意事项

JDBC函数必须通过下推在数据源上执行,下推时默认只会在下推SQL中保留函数

  • 定义的“function name”信息。而数据源中的函数可能有以下三种函数,所以下推会产生以下差异:
    – UDF函数:“catalog1.schema1.func1”,下推SQL中只包含“func1”,缺少“catalog1.schema1”,无法使用。
      – UDF函数:“schema1.func1”,下推SQL中只包含“func1”,缺少“schema1”,无法使用。
        – BUILTIN函数:“func1”,下推SQL中包含“func1”,可以使用。
          因此,在HetuEngine中创建函数时,可以通过“SPECIFIC”参数指定该函数在数据源中的限定函数名称。当给定“SPECIFIC”参数,HetuEngine下推时会在下推SQL中使用“SPECIFIC”参数值作为函数描述。否则按默认方式使用函数定义的“function name”作为函数描述。
          • 使用“CREATE FUNCTION”时,如果没有给定“SPECIFIC”参数,那么“function name”必须与数据源中的函数“function name”相同,否则HetuEngine下推会在数据源中因找不到函数而执行失败。
          【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区),文章链接,文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
          • 点赞
          • 收藏
          • 关注作者

          评论(0

          0/1000
          抱歉,系统识别当前为高风险访问,暂不支持该操作

          全部回复

          上滑加载中

          设置昵称

          在此一键设置昵称,即可参与社区互动!

          *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

          *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。