本文为您介绍如何获取不包含分隔符的字符串中指定Key对应的Value值。
获取字符串(不含分隔符)value的UDF说明
UDFKeyValue(String str, String splitor1, String splitor2, String key)
- 函数功能:从字符串中获得指定key的Value值。
说明 该UDF不适用于字符串本身包含分隔符的情况,如果需要处理该情况请使用UDFKeyValueEx。
- 参数说明
- str:字符串。
- splitor1:通过splitor1分割出
key:value
对。splitor1默认为;
。 - splitor2:对分割出来的
Key:Value
对,使用splitor2进行分割。splitor2默认为:
。
UDF使用示例
- 注册函数
UDFKeyValue.java测试通过后,将其注册函数。说明 一个UDF从发布到服务端供生产使用,需要经过打包、上传、注册这三个步骤。您可以使用一键发布功能一次性完成这些步骤(Studio会依次执行
mvn clean package
、上传Jar和注册UDF这三个步骤)。详情请参见打包、上传和注册。 - 使用示例
成功注册UDF后,执行以下命令:
- 示例一
运行结果如下。select UDFKeyValue('a:1;b:2;','a');
+-----+ | _c0 | +-----+ | 1 | +-----+
- 示例二
运行结果如下。select UDFKeyValue('a:1;b:2;','\;',':','a');
+-----+ | _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);
}
}
在文档使用中是否遇到以下问题
更多建议
匿名提交