解析Hive复杂字段2--UDF

前言

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