hive中自定义函数(UDAF)实现多行字符串拼接为一行,
函数如何使用:
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);
}
}
}
本站文章为和通数据库网友分享或者投稿,欢迎任何形式的转载,但请务必注明出处.
同时文章内容如有侵犯了您的权益,请联系QQ:970679559,我们会在尽快处理。