MaxCompute UDF配置汇总
MaxCompute UDF为数据开发人员提供了较SQL更加灵活的数据处理方式,使得在数据处理过程中,不再只是局限在SQL提供的能力,可以根据自己的需求对功能进行定制,也可以引入其他优秀的程序包简化开发的难度和工作量。有的时候一个UDF因为经过多轮迭代和长时间积累,可能功能会变的非常丰富同时又非常的复杂,常常需要利用配置进行控制,本文对几种通用的配置方案进行了汇总,供各位参考。
一、函数参数方式
执行示例:
select udf1(param1, param2) from dual; select udf1(param1,map("k","v")) from dual;
实现代码
public class udf1 extends UDF { public String evaluate(String a) { return "default value:" + a; } public String evaluate(String a, String b) { return "new value:" + a + "," + b; } public String evaluate(String a, String b, String c) { return "new value:" + a + "," + b + "," + c; } public String evaluate(String a, Integer b,List<String> c) { return "new value:" + c.get(b); } public String evaluate(String a,Map<String,String> map) { return "new value" + map.get(a); } public String evaluate(String a,Struct struct) { return "new value" + struct.getFieldValue(a); } }
特殊说明:
1,在本例最后一个实现中的Struct类型,为com.aliyun.odps.data.Struct
2,更多复杂参数类型,可以参考https://yq.aliyun.com/articles/225026
二、执行参数方式
注册函数
create function udf2 as com.aliyun.udf. udf2 using "udf-1.0-SNAPSHOT.jar";
执行示例
set myconfig.config.a=hello; set myconfig.config.other=2; select udf2(param1) from dual;
实现代码
public class udf2 extends UDF { // TODO define parameters and return type, e.g: public String evaluate(String a, String b) private String flags; public void setup(ExecutionContext ctx) throws UDFException { Properties ps= ctx.getConfigurations(); flags = ps.getProperty("myconfig.config.a"); /* 说明,目前ctx.getConfigurations();仅能kv返回,不能支持便利操作,所以如下代码并不能返回全部变量 System.out.println("keys count : "+ps.size()); Set<Map.Entry<Object, Object>> ent = ps.entrySet() ; Iterator<Map.Entry<Object, Object>> it = ent.iterator(); while(((Iterator) it).hasNext()) { Map.Entry<Object,Object> kv = it.next(); System.out.println("key : "+kv.getKey() + " value : " + kv.getValue()); } */ } public String evaluate(String s) { if (flags == null) { return "default value:" + s; } else { return "new value:" + flags + s; } } }
特殊说明:
1,set 的kv对在getProperty的时候以“等号”区分,所以内容中不能再包含等号
2,set 设置的变量会在当前session中一直保留,设置一次后续的多个sql都能读取到,要注意范围
三、配置文件方式
注册函数
add file ./cfg.txt; create function udf3 as com.aliyun.udf.udf3 using "udf-1.0-SNAPSHOT.jar, cfg.txt";
执行示例
select udf3(param1) from dual;
实现代码
public class udf3 extends UDF { private String flags; public void setup(ExecutionContext ctx) throws UDFException { try { InputStream in = ctx.readResourceFileAsStream("cfg.txt"); BufferedReader br = new BufferedReader(new InputStreamReader(in)); flags = br.readLine(); }catch (IOException e) { System.out.println("read error, "+e.toString()); throw new UDFException(e); } } public String evaluate(String s) { if (flags == null) { return "default value:"+ s; } else{ return "new value:" + flags + s; } } }
特殊说明:
1,要使用resource配置文件,必须要在注册函数的时候using相应的resource,才能被UDF发现
2,除了使用resource文件外,其实还可以使用odps table,与本例相似,所以不再说明
3,函数注册完成后,对resource配置文件进行跟新覆盖,即可更新配置
以上三种方式基本上可以覆盖绝大多数情况,除此之外还可以组合使用,例如:某个功能复杂的特征工程的UDF,通过第一种和第二种方式,都需要在执行的时候配置多个参数,那么不如把他写成resource配置文件,同时组内开发人员众多,每个人都想使用自己的配置文件,另外又想根据情况随时做变量的微调;那么就可以将如上三种方案融合,变成一种综合方案,示例如下:
注册函数:
add file usr1.txt; add file usr2.txt; add file usr3.txt; add file usr4.txt; create function udf4 as com.aliyun.udf.udf4 using "udf-1.0-SNAPSHOT.jar, usr1.txt,usr2.txt, usr3.txt,usr4.txt";
执行示例
select udf4(param1, map()) from dual; -- 默认分支 set myconfig.config.file=usr3.txt; select udf4(param1,map()) from dual; --有配置文件的分支 set myconfig.config.file=usr3.txt; select udf4(param1, map("k","v")) from dual; --有配置文件,但是通过函数参数调整配置的分支
实现代码
public class udf4 extends UDF { private String flags; public void setup(ExecutionContext ctx) throws UDFException { try { Properties ps= ctx.getConfigurations(); String path = ps.getProperty("myconfig.config.file"); if (path == null || path.length() <= 0) return ; InputStream in = ctx.readResourceFileAsStream(path); BufferedReader br = new BufferedReader(new InputStreamReader(in)); flags = br.readLine(); }catch (IOException e) { System.out.println("read error, "+e.toString()); throw new UDFException(e); } } public String evaluate(String s, Map<String,String> mflags) { if (mflags.size() > 0) { return "new value 1:" + s; } if (flags == null) { return "default value:"+ s; } else{ return "new value 2:" + flags + s; } } }
特殊说明
1,在注册函数的时候,必须将所有可能用到的配置文件都注册,不然函数无法注册成功
除了普通的UDF外,UDAF、UDTF可用同样的方法进行配置。Python UDF的处理方式可参见:https://help.aliyun.com/document_detail/73359.html?spm=a1z2e.8101737.webpage.dtitle2.bb2a6a6c6Di3vt
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
SpringBoot+kafka+ELK分布式日志收集
一、背景 随着业务复杂度的提升以及微服务的兴起,传统单一项目会被按照业务规则进行垂直拆分,另外为了防止单点故障我们也会将重要的服务模块进行集群部署,通过负载均衡进行服务的调用。那么随着节点的增多,各个服务的日志也会散落在各个服务器上。这对于我们进行日志分析带来了巨大的挑战,总不能一台一台的登录去下载日志吧。那么我们需要一种收集日志的工具将散落在各个服务器节点上的日志收集起来,进行统一的查询及管理统计。那么ELK就可以做到这一点。 ELK是ElasticSearch+Logstash+Kibana的简称,在这里我分别对如上几个组件做个简单的介绍: 1.1、ElasticSearch(简称ES) Elasticsearch是一个高度可扩展的开源全文搜索和分析引擎。它允许您快速、实时地存储、搜索和分析大量数据。它通常用作底层引擎/技术,为具有复杂搜索特性和需求的应用程序提供动力。我们可以借助如ElasticSearch完成诸如搜索,日志收集,反向搜索,智能分析等功能。ES设计的目标: 快速实时搜索 Elasticsearch是一个实时搜索平台。这意味着,从索引文档到可搜索文档,存在轻微的延迟...
- 下一篇
hadoop框架结构学习详述
hadoop框架结构学习详述近年,随着互联网的发展特别是移动互联网的发展,数据的增长呈现出一种爆炸式的成长势头。单是谷歌的爬虫程序每天下载的网页超过1亿个(2000年数据,)数据的爆炸式增长直接推动了海量数据处理技术的发展。谷歌公司提出的大表、分布式文件系统和分布式计算的三大技术构架,解决了海量数据处理的问题。谷歌公司随即将设计思路开源,发表了具有划时代意义的三篇论文,很快根据谷歌设计思路的开源框架就出现了,就是如今非常火爆的hadoop、Maperduce和许多Nosql系统。这三大技术也是整个大数据技术的核心基础。目前国内的hadoop商业发行版也是比较多,这些hadoop商业版大部分都是由国外发行的,纯国产的发行版不是很多,比如DKhadoop,可以说是目前国内自主做hadoop商业版比较好的了。下面就以大快搜索DKhadoop为例来给大家介绍一下hadoop框架结构! 图示:DKhadoop技术技术架构图hadoop框架结构核心:hadoop的框架结构最核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储,MapReduce为海量的数据提供了计算。大数据...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8编译安装MySQL8.0.19
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Hadoop3单机部署,实现最简伪集群
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果