UDF简记
摘要:
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简记的更多相关文章
- Hive简记
在大数据工作中难免遇到数据仓库(OLAP)架构,以及通过Hive SQL简化分布式计算的场景.所以想通过这篇博客对Hive使用有一个大致总结,希望道友多多指教! 摘要: 1.Hive安装 2.Hive ...
- SQL Server-聚焦在视图和UDF中使用SCHEMABINDING(二十六)
前言 上一节我们讨论了视图中的一些限制以及建议等,这节我们讲讲关于在UDF和视图中使用SCHEMABINDING的问题,简短的内容,深入的理解,Always to review the basics. ...
- RangePartitioner 实现简记
摘要: 1.背景 2.rangeBounds 上边界数组源码走读 3.RangePartitioner的sketch 源码走读 4.determineBounds 源码走读 5.关于RangePart ...
- MySql UDF 调用外部程序和系统命令
1.mysql利用mysqludf的一个mysql插件可以实现调用外部程序和系统命令 下载lib_mysqludf_sys程序:https://github.com/mysqludf/lib_mysq ...
- Hive UDF初探
1. 引言 在前一篇中,解决了Hive表中复杂数据结构平铺化以导入Kylin的问题,但是平铺之后计算广告日志的曝光PV是翻倍的,因为一个用户对应于多个标签.所以,为了计算曝光PV,我们得另外创建视图. ...
- sparksql udf的运用----scala及python版(2016年7月17日前完成)
问:udf在sparksql 里面的作用是什么呢? 答:oracle的存储过程会有用到定义函数,那么现在udf就相当于一个在sparksql用到的函数定义: 第二个问题udf是怎么实现的呢? regi ...
- Hive UDF开发实例学习
1. 本地环境配置 必须包含的一些包. http://blog.csdn.net/azhao_dn/article/details/6981115 2. 去重UDF实例 http://blog.csd ...
- Adding New Functions to MySQL(User-Defined Function Interface UDF、Native Function)
catalog . How to Add New Functions to MySQL . Features of the User-Defined Function Interface . User ...
- gearman mysql udf
gearman安装 apt-get install gearman gearman-server libgearman-dev 配置bindip /etc/defalut/gearman-job-se ...
随机推荐
- 数字平滑 前端插件JS&CSS库
CDN DEMO 拷贝可用: <!DOCTYPE html> <link rel="stylesheet" href="https://cdn.boot ...
- 概率DP自学
转自https://blog.csdn.net/zy691357966/article/details/46776199 zy691357966的blog 有关概率和期望问题的研究 摘要 在各类信息学 ...
- 自学Linux命令行与Shell脚本之路
自学Linux命令行与Shell脚本之路[第一回]:初识Linux 1.1 自学Linux Shell1.1-Linux初识 1.2 自学Linux Shell1.2-Linux目录结构 1.3 ...
- JS简易弹出层
目标 实现简易的js弹出框.为了简单灵活的在小项目中使用. 实现思路 研究bootstrap的弹出框效果后,认为层级示意图如下: 层说明 弹出层分为三层.最底层的遮罩层,覆盖在浏览器视口上.它之上是弹 ...
- poj2373 Dividing the Path (单调队列+dp)
题意:给一个长度为L的线段,把它分成一些份,其中每份的长度∈[2A,2B]且为偶数,而且不能在某一些区间内部切开,求最小要分成几份 设f[i]为在i处切一刀,前面的满足要求的最小份数,则f[L]为答案 ...
- io系列之常用流一
一. 读取键盘录入和数据打印 在System类中, System.out: 对应的是标准输出设备(控制台)(一个PrintStream). System.in: 对应的是标准输入设备(键盘)(一个In ...
- 免费馅饼 HDU - 1176 (动态规划)
都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉落在他身旁的10米范围内.馅饼如果掉在了地上当然就 ...
- Circular view path xxx would dispatch back to the current handler URL,Check your ViewResolver setup
Circular view path xxx would dispatch back to the current handler URL 通过原因分析,造成问题有两个因素:1). 缺省转发, 2). ...
- pycharm更新之后pip显示没有main
更新pip之后,Pycharm安装package出现报错:module 'pip' has no attribute 'main' 找到安装目录下 helpers/packaging_tool.py文 ...
- Calendar 类 案例 和 闰年的计算
Calendar 类 是一个抽象类 getInstance()直接返回子类对象 直接调用 主要方法:get set add 代码如下: package cn.lijun.demo; import ja ...