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)