本文为您介绍如何获取不包含分隔符的字符串中指定key对应的value值。

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

  • 函数名:UDFKeyValue
  • 功能:从字符串中获得指定keyvalue值。
    说明 该UDF不适用于字符串本身包含分隔符的情况,如果需要处理该情况请使用UDFKeyValueEx
  • 参数说明

    UDFKeyValue(String str, String splitor1, String splitor2, String key)

    • str:字符串。
    • splitor1:通过splitor1分割出key:value对。
    • splitor2:对分割出来的key:value对,使用splitor2进行分割。
    • key:要获取的参数值。
    UDFKeyValue(String keyValues, String split)
    • str:字符串。
    • key:要获取的参数值。splitor1;splitor2:

UDF使用示例

  1. 注册函数
    UDFKeyValue.java测试通过后,将其注册函数。

    说明 一个UDF从发布到服务端供生产使用,需要经过打包、上传、注册这三个步骤。您可以使用一键发布功能一次性完成这些步骤(Studio会依次执行mvn clean package、上传Jar和注册UDF这三个步骤)。详情请参见打包、上传和注册
  2. 使用示例
    成功注册UDF后,执行以下命令:
    • 示例一
      select UDFKeyValue('a:1;b:2;','a') from dual;
      运行结果如下。
      +-----+
      | _c0 |
      +-----+
      | 1   |
      +-----+
    • 示例二
      select UDFKeyValue('a:1;b:2;','\;',':','a') from dual;
      运行结果如下。
      +-----+
      | _c0 |
      +-----+
      | 1   |
      +-----+

UDF代码示例

//package名称,可以根据您的情况定义。
package com.aliyun.odps.examples.udf;
import com.aliyun.odps.io.Text;
import com.aliyun.odps.udf.UDF;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class UDFKeyValue extends UDF{
        // 存储所有键:值对。
    private Map<String, String> mKeyValueache = new ConcurrentHashMap<String, String>();
    private Text result = new Text();

    public UDFKeyValue() {
    }

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

    public String evaluate(String str, String split1, String split2, String keyname) {
        try {   
                        // 通过splitor1分割出key:value对。
            if (str == null || "".equals(str))
                return null;
            String[] values1 = str.split(split1);
            mKeyValueache.clear();
            int i = 0;
                        // 对分割出来的key:value对,使用splitor2进行分割。
            while (i < values1.length) {
                storeKeyValue(values1[i], split2);
                i++;
            }
            String resultValue = getKeyValue(keyname);
            if (resultValue == null)
                return null;
            result.set(new Text(resultValue));
                        // 获取结果值。
            return result.toString();
        } catch (Exception e) {
            return null;
        }
    }

    private boolean storeKeyValue(String keyValues, String split) {
        if (keyValues == null || "".equals(keyValues))
            return false;
        if (mKeyValueache == null)
            mKeyValueache = new ConcurrentHashMap<String, String>();
        String[] keyValueArr = keyValues.split(split);
        if (keyValueArr.length == 2) {
            mKeyValueache.put(keyValueArr[0], keyValueArr[1]);
            return true;
        }
        return false;
    }

    private String getKeyValue(String keyName) {
        if (keyName == null || 
            "".equals(keyName) || 
            mKeyValueache == null || 
            mKeyValueache.size() == 0)
            return null;
        return mKeyValueache.get(keyName);
    }
}