本文向您介绍如何获取含有二级分隔符字符串中指定key对应的value值的Java UDF示例。

获取字符串(含有分隔符)value的UDF说明

  • 函数名:UDFKeyValueEx
  • 功能

    取出key所对应的value值。先按一级分隔符进行分割,然后按二级分隔符进行分隔,再取出key所对应的value值。与UDFKeyValue主要的不同在于,该UDF适用于value值本身含有二级分隔的情况。

  • 参数说明

    UDFKeyValueEx(String str, String split1, String split2, String keyname)

    • @str:字符串
    • @split1:一级分隔符,为正则表达式
    • @split2:二级分隔符, 非正则表达式
    • @keyname:要获取的key值

    UDFKeyValueEx(String str, String keyname)

    • @str:字符串
    • @keyname:要获取的key值,默认一级分隔符为;二级分隔符为:

UDF使用示例

  1. 注册函数
    UDFKeyValueEx.java测试通过后,将其注册函数,如下图。

    说明
    • studio提供了一键发布功能,即依次执行mvn clean package,上传jar和注册UDF三个步骤。您也可以在DataWorks选择资源管理,点击资源上传,选择Jar包完成上传,详细内容请参见资源
    • 通过客户端使用常用命令进行资源上传操作,请参见资源操作
  2. 使用示例
    成功注册UDF后,执行命令:
    • 示例一
      select UDFKeyValueEx('a:b;c:d', ';', ':', 'a') from dual;
      • 结果:
        +-----+
        | _c0 |
        +-----+
        | b   |
        +-----+
    • 示例二
      select UDFKeyValueEx('a:b:c;c:d', ';', ':', 'a:b') from dual;
      • 结果:
        +-----+
        | _c0 |
        +-----+
        | c   |
        +-----+

UDF代码示例

// package名称,可以根据您的情况定义
package com.aliyun.odps.examples.udf; 
import com.taobao.bi.odps.udf.UDF;

public class UDFKeyValueEx extends UDF {

	public String evaluate(String str, String keyname) {
                // 默认fault split1=; split2=:
		return evaluate(str, ";", ":", keyname);
	}

	public String evaluate(String str, String split1, String split2, String keyname) {
		try {
			if (str==null || split1==null || split2==null || keyname==null){
				return null;
			}
                        // 使用二级分隔符
			String keySplit = keyname+split2;
                        // 遍历字符串
			for (String subStr : str.split(split1)){
				if (subStr.startsWith(keySplit)){
					if (keySplit.length() < subStr.length()){
                                                //返回结果值
						return subStr.substring(keySplit.length());
					}else{
						return null;
					}
				}
			}

			// 没有key对应的value
			return null;
		} catch (Exception e) {
			return null;
		}
	}
}