美文网首页
解析Hive复杂字段2--UDF

解析Hive复杂字段2--UDF

作者: 风筝flying | 来源:发表于2018-08-27 14:50 被阅读187次

    前言

    上一篇文章说道工作中遇到一个需要解析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;

        }

    }

    解析Hive复杂字段1--lateral view explode

    相关文章

      网友评论

          本文标题:解析Hive复杂字段2--UDF

          本文链接:https://www.haomeiwen.com/subject/mczziftx.html