您的位置:首页 > 其它

hive中自定义函数(UDAF)实现多行字符串拼接为一行

2013-08-22 10:32 891 查看
函数如何使用:

hive> desc concat_test;

OK

a int

b string

hive> select * from concat_test;

OK

1 good

2 other

1 nice

1 hello

hive> select a,concat(b,',') from concat_test group by a;

OK

1 good,nice,hello

2 other

函数实现:

import org.apache.hadoop.hive.ql.exec.UDAF;
import org.apache.hadoop.hive.ql.exec.UDAFEvaluator;

public class ConnectGroup extends UDAF{

public static class ConcatUDAFEvaluator implements UDAFEvaluator{

public static class PartialResult{
String result;
String delimiter;
}

private PartialResult partial;

public void init() {
partial = null;
}

public boolean iterate(String value, String deli){

if(value == null){
return true;
}

if(partial == null){
partial = new PartialResult();
partial.result = new String("");
if(deli == null || deli.equals("")){
partial.delimiter = new String(",");
}
else{
partial.delimiter = new String(deli);
}
}
if( partial.result.length() > 0 ){
partial.result = partial.result.concat(partial.delimiter);
}
partial.result = partial.result.concat(value);
return true;
}

public PartialResult terminatePartial(){
return partial;
}

public boolean merge(PartialResult other){
if (other == null){
return true;
}
if (partial == null){
partial = new PartialResult();
partial.result = new String(other.result);
partial.delimiter = new String(other.delimiter);
}
else{
if ( partial.result.length() > 0 ){
partial.result = partial.result.concat(partial.delimiter);
}
partial.result = partial.result.concat(other.result);
}
return true;
}

public String terminate(){
return new String(partial.result);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: