前言
上一篇文章说道工作中遇到一个需要解析Hive的复杂字段提取HotelId的多个结果的问题,第一时间采用了Hive sql自带的lateral view,explode及正则表达式处理成功,现在尝试采用hive udf 方式处理这个需求。
Hive UDF
在Hive中,用户可以自定义一些函数,用于扩展HiveQL的功能,而这类函数叫做UDF(用户自定义函数)。UDF分为两大类:UDAF(用户自定义聚合函数)和UDTF(用户自定义表生成函数)。
Hive有两个不同的接口编写UDF程序。一个是基础的UDF接口,一个是复杂的GenericUDF接口。
org.apache.hadoop.hive.ql. exec.UDF 基础UDF的函数读取和返回基本类型,即Hadoop和Hive的基本类型。如,Text、IntWritable、LongWritable、DoubleWritable等。
org.apache.hadoop.hive.ql.udf.generic.GenericUDF 复杂的GenericUDF可以处理Map、List、Set类型。
本文采用基础的UDF接口,返回基础的String类型,复杂的GenericUDF在下一篇文章中实现
UDF实例
简单的UDF开发只需要继承UDF(org.apache.hadoop.hive.ql.exec.UDF)类,然后实现evaluate方法,该方法允许重载
具体需求已经在上篇文章描述清楚,下面直接放该UDF的实现代码
import org.apache.hadoop.hive.ql.exec.UDF;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import java.util.ArrayList;
import org.apache.commons.lang.StringUtils;
public class GetHotelIdextends UDF{
public String evaluate(String jsonString){
try{
return GetHotelList(jsonString);
}catch (net.sf.json.JSONException ex){
return null;
}
}
public static String GetHotelList(String jsonstring){
//System.out.println(jsonstring);
JSONObject job=JSONObject.fromObject(jsonstring);
//System.out.println(job);
JSONArray ja=job.getJSONArray(“htllist”);
//System.out.println(ja);
ArrayList htllist=new ArrayList();
for(int i=0;i
JSONObject jobd=ja.getJSONObject(i);
if(jobd.has(“hotelid”)){
htllist.add(jobd.getInt(“hotelid”));
}
}
return StringUtils.join(htllist.toArray(),”,”);
//return htllist;
}
}