原博文出自于:http://blog.csdn.net/longzilong216/article/details/23921235(暂时)      感谢!

自己写代码时候的利用到的模板

 
UDF步骤:
1.必须继承org.apache.hadoop.hive.ql.exec.UDF
2.必须实现evaluate函数,evaluate函数支持重载

  

  1. <span style="font-size: x-small;">package com.alibaba.hive.udf;
  2. import org.apache.hadoop.hive.ql.exec.UDF
  3. public class helloword extends UDF{
  4. public String evaluate(){
  5. return "hello world!";
  6. }
  7. public String evaluate(String str){
  8. return "hello world: " + str;
  9. }
  10. }</span>
UDAF步骤:
1.必须继承
     org.apache.hadoop.hive.ql.exec.UDAF(函数类继承)
     org.apache.hadoop.hive.ql.exec.UDAFEvaluator(内部类Evaluator实现UDAFEvaluator接口)
2.Evaluator需要实现 init、iterate、terminatePartial、merge、terminate这几个函数
     init():类似于构造函数,用于UDAF的初始化
     iterate():接收传入的参数,并进行内部的轮转。其返回类型为boolean
     terminatePartial():无参数,其为iterate函数轮转结束后,返回乱转数据,iterate和terminatePartial类似于hadoop的Combiner(iterate--mapper;terminatePartial--reducer)
     merge():接收terminatePartial的返回结果,进行数据merge操作,其返回类型为boolean
     terminate():返回最终的聚集函数结果
  1. <span style="font-size: x-small;">package com.alibaba.hive;
  2. import org.apache.hadoop.hive.ql.exec.UDAF;
  3. import org.apache.hadoop.hive.ql.exec.UDAFEvaluator;
  4. public class myAVG extends UDAF{
  5. public static class avgScore{
  6. private long pSum;
  7. private double pCount;
  8. }
  9. public static class AvgEvaluator extends UDAFEvaluator{
  10. avgScore score;
  11. public AvgEvaluator(){
  12. score = new avgScore();
  13. init();
  14. }
  15. /*
  16. *init函数类似于构造函数,用于UDAF的初始化
  17. */
  18. public void init(){
  19. score.pSum = 0;
  20. score.pCount = 0;
  21. }
  22. /*
  23. *iterate接收传入的参数,并进行内部的轮转。其返回类型为boolean
  24. *类似Combiner中的mapper
  25. */
  26. public boolean iterate(Double in){
  27. if(in != null){
  28. score.pSum += in;
  29. score.pCount ++;
  30. }
  31. return true;
  32. }
  33. /*
  34. *terminatePartial无参数,其为iterate函数轮转结束后,返回轮转数据
  35. *类似Combiner中的reducer
  36. */
  37. public avgScore terminatePartial(){
  38. return score.pCount == 0 ? null : score;
  39. }
  40. /*
  41. *merge接收terminatePartial的返回结果,进行数据merge操作,其返回类型为boolean
  42. */
  43. public boolean merge(avgScore in){
  44. if(in != null){
  45. score.pSum += in.pSum;
  46. score.pCount += in.pCount;
  47. }
  48. return true;
  49. }
  50. /*
  51. *terminate返回最终的聚集函数结果
  52. */
  53. public Double terminate(){
  54. return score.pCount == 0 ? null : Double.valueof(score.pSum/score.pCount);
  55. }
  56. }
  57. }</span>
UDTF步骤:
  1.必须继承org.apache.hadoop.hive.ql.udf.generic.GenericUDTF
  2.实现initialize, process, close三个方法
  3.UDTF首先会
       a.调用initialize方法,此方法返回UDTF的返回行的信息(返回个数,类型)
       b.初始化完成后,会调用process方法,对传入的参数进行处理,可以通过forword()方法把结果返回
       c.最后close()方法调用,对需要清理的方法进行清理
  1. <span style="font-size: x-small;"><span style="font-size: xx-small;">public class GenericUDTFExplode extends GenericUDTF {
  2. private ListObjectInspector listOI = null;
  3. @Override
  4. public void close() throws HiveException {
  5. }
  6. @Override
  7. public StructObjectInspector initialize(ObjectInspector[] args) throws UDFArgumentException {
  8. if (args.length != 1) {
  9. throw new UDFArgumentException("explode() takes only one argument");
  10. }
  11. if (args[0].getCategory() != ObjectInspector.Category.LIST) {
  12. throw new UDFArgumentException("explode() takes an array as a parameter");
  13. }
  14. listOI = (ListObjectInspector) args[0];
  15. ArrayList<String> fieldNames = new ArrayList<String>();
  16. ArrayList<ObjectInspector> fieldOIs = new ArrayList<ObjectInspector>();
  17. fieldNames.add("col");
  18. fieldOIs.add(listOI.getListElementObjectInspector());
  19. return ObjectInspectorFactory.getStandardStructObjectInspector(fieldNames,
  20. fieldOIs);
  21. }
  22. private final Object[] forwardObj = new Object[1];
  23. @Override
  24. public void process(Object[] o) throws HiveException {
  25. List<?> list = listOI.getList(o[0]);
  26. if(list == null) {
  27. return;
  28. }
  29. for (Object r : list) {
  30. forwardObj[0] = r;
  31. forward(forwardObj);
  32. }
  33. }
  34. @Override
  35. public String toString() {
  36. return "explode";
  37. }
  38. }</span></span>

【转】HIVE UDF UDAF UDTF 区别 使用的更多相关文章

  1. [转]HIVE UDF/UDAF/UDTF的Map Reduce代码框架模板

    FROM : http://hugh-wangp.iteye.com/blog/1472371 自己写代码时候的利用到的模板   UDF步骤: 1.必须继承org.apache.hadoop.hive ...

  2. hive中 udf,udaf,udtf

    1.hive中基本操作: DDL,DML 2.hive中函数 User-Defined Functions : UDF(用户自定义函数,简称JDF函数)UDF: 一进一出  upper  lower ...

  3. Hive 自定义函数 UDF UDAF UDTF

    1.UDF:用户定义(普通)函数,只对单行数值产生作用: 继承UDF类,添加方法 evaluate() /** * @function 自定义UDF统计最小值 * @author John * */ ...

  4. 简述UDF/UDAF/UDTF是什么,各自解决问题及应用场景

    UDF User-Defined-Function 自定义函数 .一进一出: 背景 系统内置函数无法解决实际的业务问题,需要开发者自己编写函数实现自身的业务实现诉求. 应用场景非常多,面临的业务不同导 ...

  5. UDF/UDAF开发总结

    参考文章: https://www.cnblogs.com/itxuexiwang/p/6264547.html https://www.cnblogs.com/eRrsr/p/6096989.htm ...

  6. Hive UDF 实验1

    项目中使用的hive版本低于0.11,无法使用hive在0.11中新加的开窗分析函数. 在项目中需要使用到row_number()函数的地方,有人写了udf来实现这个功能. new java proj ...

  7. 2、Hive UDF编程实例

    Hive的UDF包括3种:UDF(User-Defined Function).UDAF(User-Defined Aggregate Function)和UDTF(User-Defined Tabl ...

  8. 如何编写自定义hive UDF函数

    Hive可以允许用户编写自己定义的函数UDF,来在查询中使用.Hive中有3种UDF: UDF:操作单个数据行,产生单个数据行: UDAF:操作多个数据行,产生一个数据行. UDTF:操作一个数据行, ...

  9. Hive UDF,就这

    摘要:Hive UDF是什么?有什么用?怎么用?什么原理?本文从UDF使用入手,简要介绍相关源码,UDF从零开始. 本文分享自华为云社区<Hive UDF,就这>,作者:汤忒撒. Hive ...

随机推荐

  1. SOJ 3300_Stockholm Coins

    [题意]给n个数,求一个数,使这个数能且只能由(n个数每个至少出现一次)表示.输出满足条件的最小的数. [分析](完全背包)如果有满足条件的最小的数,那么这个数只能是这n个数的和total,通过记录每 ...

  2. Warm up-HUD4612(树的直径+Tarjin缩点)

    http://acm.hdu.edu.cn/showproblem.php?pid=4612 题目大意:求加一条边最小的桥数 先用Tarjin缩点求出一棵树,然后用bfs求出树的直径,树的直径就是加一 ...

  3. Mybatis中的ognl表达式。及myabtis where标签/if test标签/trim标签

    1.mybatis默认支持使用ognl表达式来生成动态sql语句 MyBatis中可以使用OGNL的地方有两处: 动态SQL表达式中 ${param}参数中 上面这两处地方在MyBatis中处理的时候 ...

  4. 手把手教你开发Chrome扩展三:关于本地存储数据

    手把手教你开发chrome扩展一:开发Chrome Extenstion其实很简单 手把手教你开发Chrome扩展二:为html添加行为 手把手教你开发Chrome扩展三:关于本地存储数据 HTML5 ...

  5. excel2010英文大写怎么变小写

    excel大写转小写步骤如下: 1.如下图所示,若要对字母进行大.小写转换可以使用如下的步骤. 2.若要将单元格中的所有字母全部转换为大写形式,可以使用UPPER函数. 公式为 =UPPER(A2) ...

  6. react 项目实战(四)组件化表单/表单控件 高阶组件

    高阶组件:formProvider 高阶组件就是返回组件的组件(函数) 为什么要通过一个组件去返回另一个组件? 使用高阶组件可以在不修改原组件代码的情况下,修改原组件的行为或增强功能. 我们现在已经有 ...

  7. KLT 光流

    一 光流 光流的概念是Gibson在1950年首先提出来的.它是空间运动物体在观察成像平面上的像素运动的瞬时速度,是利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在 ...

  8. Linux地址ping不通情况怎么办?

    查看原文:http://www.ibloger.net/article/325.html Linux地址ping不通情况怎么办? 问题:今天写了一个微信支付的项目.有一个class中使用了httpPo ...

  9. 服务器无法处理请求。 ---> 未将对象引用设置到对象的实例

    服务器无法处理请求. ---> 未将对象引用设置到对象的实例. 简短说下我遇到的问题.webservice部署到服务器上后,访问方法报上面的错误,最终原因为改方法需要操作文件夹,加上了相应的权限 ...

  10. python爬虫【第1篇】

    一.文件读写 1.打开文件 # 以读文件模式代开new.txt f=open(r"c:\new.txt",“r”) f=open("c:\new.txt",“r ...