hive UDAF行列转换

来源:互联网 发布:按键精灵 数据库插件 编辑:程序博客网 时间:2024/05/01 12:41

目标实现

1 a

1 b

2 a

2 c

转换为

1 a,b

2 a,c

package com.hive.udf;//用法 select a,concat1(b,',') from concat_test group by a;import org.apache.hadoop.hive.ql.exec.UDAF;import org.apache.hadoop.hive.ql.exec.UDAFEvaluator;public class Concat extends UDAF { public static class ConcatUDAFEvaluator implements UDAFEvaluator{  public static class PartialResult{   String result;   String delimiter;  }  private PartialResult partial;  //init函数实现接口UDAFEvaluator的init函数。  public void init() {   partial = null;  }  //iterate接收传入的参数,并进行内部的轮转。其返回类型为boolean。  //接受传入的参数,并进行内部的轮转  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;  }  //terminatePartial无参数,其为iterate函数轮转结束后,返回轮转数据,terminatePartial类似于hadoop的Combiner。    public PartialResult terminatePartial(){   return partial;  }    //merge接收terminatePartial的返回结果,进行数据merge操作,其返回类型为boolean。  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);  } }}

打包jar后

add jar rowtocol.jar

create temporary function concat_test as'com.hive.udf.Concat'; 

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

0 0