UDF简记

时间:2023-01-29 20:15:49
摘要:
  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地址)
 import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONTokener; import java.util.ArrayList; /**
* Created by arachis on 2017/10/19.
* 一个简单的UDF:
* 解析json array中的指定字段,并用下划线拼接起来
*/
public class MyUDF extends UDF {
/**
* 把json array字符串中指定的字段解析出来
* @param jsonArrayStr 要解析的json array字符串
* @param column 要提取的字段
* @return str
*
* hive example:
* hive>select *,parse_json_array(get_json_object('{"data":[{"id":1082},{"id":1082},{"id":1082}]}','$.data'),'id') from dual;
* hive>+-----------+-----------------+--+
| dual.foo | _c1 |
+-----------+-----------------+--+
| NULL | 1082_1082_1082 |
+-----------+-----------------+--+
*/
public String evaluate(String jsonArrayStr,String column) {
if((jsonArrayStr==null)|| StringUtils.isBlank(jsonArrayStr)||! jsonArrayStr.trim().startsWith("[")){
return null;
}
JSONArray jsonArray = null;
ArrayList<String> tag_ids = new ArrayList<String>();
try {
jsonArray = new JSONArray(new JSONTokener(jsonArrayStr));
for(int i=0;i<jsonArray.length();i++){
String json = jsonArray.getJSONObject(i).get(column).toString();
tag_ids.add( json );
}
} catch (JSONException e) {
e.printStackTrace();
} return StringUtils.join( tag_ids,'_' );
} public static void main(String[] args) {
String jas = "[{\"id\":1082},{\"id\":1082},{\"id\":1082}]";
System.out.println(new MyUDF().evaluate(jas,"id") ); }
														
		

UDF简记的更多相关文章

  1. Hive简记

    在大数据工作中难免遇到数据仓库(OLAP)架构,以及通过Hive SQL简化分布式计算的场景.所以想通过这篇博客对Hive使用有一个大致总结,希望道友多多指教! 摘要: 1.Hive安装 2.Hive ...

  2. SQL Server-聚焦在视图和UDF中使用SCHEMABINDING(二十六)

    前言 上一节我们讨论了视图中的一些限制以及建议等,这节我们讲讲关于在UDF和视图中使用SCHEMABINDING的问题,简短的内容,深入的理解,Always to review the basics. ...

  3. RangePartitioner 实现简记

    摘要: 1.背景 2.rangeBounds 上边界数组源码走读 3.RangePartitioner的sketch 源码走读 4.determineBounds 源码走读 5.关于RangePart ...

  4. MySql UDF 调用外部程序和系统命令

    1.mysql利用mysqludf的一个mysql插件可以实现调用外部程序和系统命令 下载lib_mysqludf_sys程序:https://github.com/mysqludf/lib_mysq ...

  5. Hive UDF初探

    1. 引言 在前一篇中,解决了Hive表中复杂数据结构平铺化以导入Kylin的问题,但是平铺之后计算广告日志的曝光PV是翻倍的,因为一个用户对应于多个标签.所以,为了计算曝光PV,我们得另外创建视图. ...

  6. sparksql udf的运用----scala及python版(2016年7月17日前完成)

    问:udf在sparksql 里面的作用是什么呢? 答:oracle的存储过程会有用到定义函数,那么现在udf就相当于一个在sparksql用到的函数定义: 第二个问题udf是怎么实现的呢? regi ...

  7. Hive UDF开发实例学习

    1. 本地环境配置 必须包含的一些包. http://blog.csdn.net/azhao_dn/article/details/6981115 2. 去重UDF实例 http://blog.csd ...

  8. Adding New Functions to MySQL&lpar;User-Defined Function Interface UDF、Native Function&rpar;

    catalog . How to Add New Functions to MySQL . Features of the User-Defined Function Interface . User ...

  9. gearman mysql udf

    gearman安装 apt-get install gearman gearman-server libgearman-dev 配置bindip /etc/defalut/gearman-job-se ...

随机推荐

  1. QF——OC中的KVC&comma;KVO

    KVC: (Key Value Coding) 键值编码 所谓KVC,其实就是不通过set和get方法访问对象属性,而是通过属性名字符串动态的去读取属性.KVC其实也是OC反射机制的一种运用. 之所以 ...

  2. 讨论oracle在rowid和rownum

    [ 概要 ] 刚刚接触oracle的同学可能经常会被rowid和rownum这两个词弄混, 弄清楚这两个家伙对于我们写sql会有非常大的帮助, 以下偶就抛砖引玉, 简单地谈谈他们之间的差别吧. [ 比 ...

  3. Python 列表list

    列表list: [ ] 类似Java中的数组. 通过索引可以取到具体位置上的值. names = ["ZhangYang","WangGui","Li ...

  4. centos7下安装docker(9容器对资源的使用限制-内存)

                  一个docker Host上面会运行若干容器,每个容器都需要CPU,内存和IO资源.容器提供了控制分配多少CPU,内存给每个容器的机制,避免摸个容器因占用太多资源而影响其他 ...

  5. Solr-全文检索工具简介

    一.Solr的简介 Solr 是Apache下的一个*开源项目,采用Java开发,它是基于Lucene的全文搜索服务.Solr可以独立运行在Jetty.Tomcat等这些Servlet容器中.都是W ...

  6. lua学习之循环打印九九乘法表

    --第4题 输出99乘法表 function PrintMulitiplyTable() , do local res = {} local str = "" , i do res ...

  7. mac下python2&period;7升级到3&period;6

    1. 前言 Mac系统自带python2.7,本文目的是将自带的python升级到3.6版本. 网上有本多的做法是让python2.7和python3.X两个版本共存,博主并不知道,是两版本共存好,还 ...

  8. POJ3090&lpar;SummerTrainingDay04-M 欧拉函数&rpar;

    Visible Lattice Points Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7450   Accepted: ...

  9. &lbrack;Java&rsqb;接受拖拽文件的窗口

    至于这个问题,Java的awt.dnd包下提供了许多完成这一功能的类 例如DropTarget.DropTargetListener等 先来讲一下DropTarget类,这个类完成和拖拽.复制文件等操 ...

  10. Hystrix的回退和zuul的回退总结

    1.Hystrix的回退: Ribbon: Feign: zuul的回退: