该UDF适用场景,某个表有两个字段存储为有序list,一个存储多是key,一个存储value。例如,表a,含有字段c1,c2,数据格式如下:
需要取出 006 对应 小白,002 对应小灰,003 对应小黑,用sql处理没法把这个关系很好的切换出来。
可能有人考虑用split进行切割,split(c1,",")[0]、split(c2,",")[0] 这样也可以获取出来,但是如果数据很多的时候并不是很实用。
建议使用udf进行数据操作,创建一个临时function如下:
create temporary function multi_string_split as 'com.xiaolu.lu.MultiStringSplit' using jar 'hdfs:///user/test-function.jar';
在hive里面可以直接查询,返回一个list,也可以结合explode扩展数据,拿到自己想要的数据。
lateral view explode(multi_string_split(c1,c2,分隔符1,分隔符2))
package com.xiao.lu;
import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.hive.ql.exec.UDF;
import java.util.ArrayList;
/**
* @author Lu Yufeng
* @date 2018/9/14 下午23:06
*/
public class MultiStringSplit extends UDF {
public ArrayList<String> evaluate(String c1, String c2,String separator1,String separator2) {
if (StringUtils.isBlank(c1) || StringUtils.isBlank(c2)) {
return null;
}
ArrayList<String> stringList = new ArrayList();
String[] ids = c1.split(separator1);
String[] names = c2.split(separator2);
if (ids.length == names.length) {
for (int i = 0; i < ids.length; i++) {
String result = ids[i] +":"+ names[i];
stringList.add(result);
}
} else {
for (int i = 0; i < ids.length; i++) {
if(names.length>i){
String result = ids[i] +":"+ names[i];
stringList.add(result);
}else {
String result = ids[i]+":"+null;
stringList.add(result);
}
}
}
return stringList;
}
public static void main(String[] args) {
MultiStringSplit ms = new MultiStringSplit();
String ids= "10,12";
String names= "a,b";
ArrayList<String> result = ms.evaluate(ids,names,",",";");
System.out.println(result.toString());
}
}