MRS3.1.1-LTS版本 HetuEngine新特性: Local UDF, remote UDF初体验
【摘要】 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类型用户定义函数
在开始函数开发之前,需要了解:
- 确保Maven已导入Hive UDF的“hive-exec”依赖,建议依赖的版本为3.1.1及以上。
- 函数参数从SQL到UDF代码时,可能会存在数据类型差异。例如,在UDF代码中,您可能会更清楚不同类型的整数需要多少字节。
- 仔细选择参数,避免副作用,让每个函数做一件事情,等等。
编码入门
- 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”信息。而数据源中的函数可能有以下三种函数,所以下推会产生以下差异:
- 使用“CREATE FUNCTION”时,如果没有给定“SPECIFIC”参数,那么“function name”必须与数据源中的函数“function name”相同,否则HetuEngine下推会在数据源中因找不到函数而执行失败。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)