摘要:
1.开发UDF
2.开发UDAF
3.开发UDTF
4.部署与测试
5.一个简单的实例
摘要:
1.开发UDF
2.开发UDAF
3.开发UDTF
4.部署与测试
5.一个简单的实例
内容:
1.开发UDF
函数类需要继承org.apache.hadoop.hive.ql.UDF
实现evaluate函数
2.开发UDAF
函数类需要继承UDAF类,内部类Evaluator实UDAFEvaluator接口。
Evaluator需要实现 init、iterate、terminatePartial、merge、terminate这几个函数
init函数实现接口UDAFEvaluator的init函数。
iterate接收传入的参数,并进行内部的轮转。其返回类型为boolean。
terminatePartial无参数,其为iterate函数轮转结束后,返回轮转数据,terminatePartial类似于hadoop的Combiner。
merge接收terminatePartial的返回结果,进行数据merge操作,其返回类型为boolean。
terminate返回最终的聚集函数结果。
3.开发UDTF
函数类需要继承org.apache.hadoop.hive.ql.udf.generic.GenericUDTF
实现initialize, process, close三个方法。
initialize方法返回UDTF的返回行的信息(返回个数,类型)
process方法对传入的参数进行处理,可以通过forword()方法把结果返回
close()方法需要清理的方法进行清理
4.部署与测试
打包上传到HDFS
hadoop fs -put my-udf.jar /hive_functions
hive>add jar hdfs://namenode_host:8020/hive_functions/my-udf.jar;
hive>create temporary function parse_json_array as 'hive.udf.yourUDF';
5.一个简单的实例(github地址)
1 import org.apache.commons.lang.StringUtils;
2 import org.apache.hadoop.hive.ql.exec.UDF;
3 import org.json.JSONArray;
4 import org.json.JSONException;
5 import org.json.JSONTokener;
6
7 import java.util.ArrayList;
8
9 /**
10 * Created by arachis on 2017/10/19.
11 * 一个简单的UDF:
12 * 解析json array中的指定字段,并用下划线拼接起来
13 */
14 public class MyUDF extends UDF {
15 /**
16 * 把json array字符串中指定的字段解析出来
17 * @param jsonArrayStr 要解析的json array字符串
18 * @param column 要提取的字段
19 * @return str
20 *
21 * hive example:
22 * hive>select *,parse_json_array(get_json_object('{"data":[{"id":1082},{"id":1082},{"id":1082}]}','$.data'),'id') from dual;
23 * hive>+-----------+-----------------+--+
24 | dual.foo | _c1 |
25 +-----------+-----------------+--+
26 | NULL | 1082_1082_1082 |
27 +-----------+-----------------+--+
28 */
29 public String evaluate(String jsonArrayStr,String column) {
30 if((jsonArrayStr==null)|| StringUtils.isBlank(jsonArrayStr)||! jsonArrayStr.trim().startsWith("[")){
31 return null;
32 }
33 JSONArray jsonArray = null;
34 ArrayList<String> tag_ids = new ArrayList<String>();
35 try {
36 jsonArray = new JSONArray(new JSONTokener(jsonArrayStr));
37 for(int i=0;i<jsonArray.length();i++){
38 String json = jsonArray.getJSONObject(i).get(column).toString();
39 tag_ids.add( json );
40 }
41 } catch (JSONException e) {
42 e.printStackTrace();
43 }
44
45
46 return StringUtils.join( tag_ids,'_' );
47 }
48
49 public static void main(String[] args) {
50 String jas = "[{\"id\":1082},{\"id\":1082},{\"id\":1082}]";
51 System.out.println(new MyUDF().evaluate(jas,"id") );
52
53 }