MaxCompute UDF配置汇总

简介: MaxCompute UDF为数据开发人员提供了较SQL更加灵活的数据处理方式,使得在数据处理过程中,不再只是局限在SQL提供的能力,可以根据自己的需求对功能进行定制,也可以引入其他优秀的程序包简化开发的难度和工作量。

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

相关实践学习
简单用户画像分析
本场景主要介绍基于海量日志数据进行简单用户画像分析为背景,如何通过使用DataWorks完成数据采集 、加工数据、配置数据质量监控和数据可视化展现等任务。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps&nbsp;
目录
相关文章
|
2月前
|
分布式计算 DataWorks 调度
maxcompute配置问题之优先级如何解决
MaxCompute配置是指在使用阿里云MaxCompute服务时对项目设置、计算资源、存储空间等进行的各项调整;本合集将提供MaxCompute配置的指南和建议,帮助用户根据数据处理需求优化其MaxCompute环境。
33 1
|
2月前
|
存储 分布式计算 Hadoop
maxcompute配置问题之加速查询超时配置回退如何解决
MaxCompute配置是指在使用阿里云MaxCompute服务时对项目设置、计算资源、存储空间等进行的各项调整;本合集将提供MaxCompute配置的指南和建议,帮助用户根据数据处理需求优化其MaxCompute环境。
33 1
|
2月前
|
SQL 分布式计算 DataWorks
maxcompute配置问题之配置回退的参数如何解决
MaxCompute配置是指在使用阿里云MaxCompute服务时对项目设置、计算资源、存储空间等进行的各项调整;本合集将提供MaxCompute配置的指南和建议,帮助用户根据数据处理需求优化其MaxCompute环境。
40 2
|
2月前
|
分布式计算 安全 专有云
maxcompute配置问题之不能正常执行如何解决
MaxCompute配置是指在使用阿里云MaxCompute服务时对项目设置、计算资源、存储空间等进行的各项调整;本合集将提供MaxCompute配置的指南和建议,帮助用户根据数据处理需求优化其MaxCompute环境。
24 1
|
2月前
|
分布式计算 大数据 数据处理
maxcompute配置问题之配置文件key参数如何解决
MaxCompute配置是指在使用阿里云MaxCompute服务时对项目设置、计算资源、存储空间等进行的各项调整;本合集将提供MaxCompute配置的指南和建议,帮助用户根据数据处理需求优化其MaxCompute环境。
48 2
maxcompute配置问题之配置文件key参数如何解决
|
2月前
|
SQL 分布式计算 MaxCompute
maxcompute之配置报错如何解决
MaxCompute配置是指在使用阿里云MaxCompute服务时对项目设置、计算资源、存储空间等进行的各项调整;本合集将提供MaxCompute配置的指南和建议,帮助用户根据数据处理需求优化其MaxCompute环境。
35 0
|
2月前
|
SQL 存储 分布式计算
maxcompute配置问题之配置mc内容如何解决
MaxCompute配置是指在使用阿里云MaxCompute服务时对项目设置、计算资源、存储空间等进行的各项调整;本合集将提供MaxCompute配置的指南和建议,帮助用户根据数据处理需求优化其MaxCompute环境。
31 1
|
6月前
|
SQL NoSQL Java
Redis学习---大数据技术之Redis(NoSQL简介、Redis简介、Redis安装、五大数据类型、相关配置、持久化)
Redis学习---大数据技术之Redis(NoSQL简介、Redis简介、Redis安装、五大数据类型、相关配置、持久化)
|
6月前
|
分布式计算 运维 监控
DataWorks如何配置MaxCompute监控进行订阅管理?
DataWorks如何配置MaxCompute监控进行订阅管理?
43 1
|
2月前
|
数据采集 分布式计算 监控
maxcompute配置问题之需要配置如何解决
MaxCompute配置是指在使用阿里云MaxCompute服务时对项目设置、计算资源、存储空间等进行的各项调整;本合集将提供MaxCompute配置的指南和建议,帮助用户根据数据处理需求优化其MaxCompute环境。
24 0