package io.transwarp.inceptorudaf;

import org.apache.hadoop.hive.ql.exec.UDAF;
import org.apache.hadoop.hive.ql.exec.UDAFEvaluator;

public class InceptorUDAF extends UDAF {
    /*
     * 在实现inceptor自定UDAF时,必须要继承UDAF类,还有在这个类的内部实现一个内部类实现接口UDAFEvaluator
     * 并重写里面的四个主要的方法
     *
     * 1. Iterate函数用于聚合。当每一个新的值被聚合时,此函数被调用。
     * 2. TerminatePartial函数在部分聚合完成后被调用。当hive希望得到部分记录的聚合结果时,此函数被调用。
     * 3. Merge函数用于合并先前得到的部分聚合结果(也可以理解为分块记录的聚合结果)。
     * 4. Terminate返回最终的聚合结果。
     *
     * 下面代码的逻辑要实现的是:
     * 1.保存fields3的第一次出现的任何值
     * 2.保存fields4的最后一个值
     * 3.保存fields5的最后一个非空非null的有效值
     * 4.将fields6的所有非空非null的有效值使用分隔符连接起来
     * 5.返回结果是“第一次出现的fields3,最后一次出现的fields4,fields5的最后一个非空非null的有效值,fields6所有的非空
     * 非null的有效值使用分隔符连接起来的字符串”
     */
    public static class GroupByUDAFEvaluator implements UDAFEvaluator{
        // 一个bean类记录字段和分隔符信息
        public static class PartialResult{
            String filed3;
            String filed4;
            String filed5;
            String filed6;
            String delimiter;
        }

private PartialResult partial;

public void init() {
            partial = null;
        }
        /*
         * 需要实现的第一个方法
         * 每个需要处理的处理都要经过的处理
         */
        public boolean iterate(String filed3,String filed4,String filed5 ,String filed6){
            if(filed3 == null && filed4 == null && filed5 == null && filed6 == null){
                return true;
            }

if(partial == null ){
                partial = new PartialResult();
                partial.filed3 = "";
                partial.filed4 = "";
                partial.filed5 = "";
                partial.filed6 = "";
                partial.delimiter = "-";
                //filed3 logical
                partial.filed3 = filed3;
            }

//filed4 logical
            partial.filed4 = filed4;
            //filed5 logical
            if(filed5 != null && !filed5.trim().equals("")) {
                partial.filed5 = filed5;
            }
            //filed6 logical
            if(filed6 != null && !filed6.trim().equals("")) {
                if(partial.filed6.length() > 0 ){
                    partial.filed6 = partial.filed6.concat(partial.delimiter);
                }
                partial.filed6 = partial.filed6.concat(filed6);
            }
            return true;
        }

/*
         * 需要实现的第二个方法
         * 返回部分结果
         */
        public PartialResult terminatePartial(){
            return partial;
        }

/*
         * 需要实现的第三个方法
         * 将两个部分结果合并
         */
        public boolean merge(PartialResult othe){
            if (othe == null){
                return true;
            }

if(partial == null ){
                partial = new PartialResult();

partial.filed3 = othe.filed3;
                partial.filed4 = othe.filed4;
                partial.filed5 = othe.filed5;
                partial.filed6 = othe.filed6;
                partial.delimiter = othe.delimiter;
            } else {
                //filed4 logical
                partial.filed4 = othe.filed4;
                //filed5 logical
                if(othe.filed5 != null && !othe.filed5.trim().equals("")) {
                    partial.filed5 = othe.filed5;
                }
                //filed6 logical
                if(othe.filed6 != null && !othe.filed6.trim().equals("")) {
                    if (partial.filed6.length() >0){
                        partial.filed6 = partial.filed6.concat(othe.delimiter);
                    }
                    partial.filed6 = partial.filed6.concat(othe.filed6);
                }
            }
            return true;
        }

/*
         * 需要实现的第四个方法
         * 构造返回值类型,返回结果
         */
        public String terminate(){
            return "filed3:"+partial.filed3+" filed4:" +partial.filed4+"  filed5 :"+partial.filed5+" filed6: "+partial.filed6;
        }
    }
}

Inceptor UDF相关推荐

  1. hive udf 分组取top1_Hive的经典面试题

    很久没有发文章了,今天发表一下Hive的总结,如果那里有不足的欢迎指正,顺便再提一个问题(数仓建模中:细化程度越高,粒度级就越小,相反,细化程度越低,粒度级就越大,这个说法能打个比方比喻出来吗?) 必 ...

  2. nodejs mysql 异步_Gearman + Nodejs + MySQL UDF异步实现 MySQL 到 Redis 的数据同步

    1, 环境 CentOS, MySQL, Redis, Nodejs Redis是一个开源的K-V内存数据库,它的key可以是string/set/hash/list/...,因为是基于内存的,所在访 ...

  3. MapReduce 中 UDF、UDAF、UDTF

    UDF UDF只能实现一进一出的操作,如果需要实现多进一出,则需要实现UDAF UDF函数可以直接应用于select语句,对查询结构做格式化处理后,再输出内容 UDAF UDFA是用户自定义的聚类函数 ...

  4. Python编写Hive UDF

    2019独角兽企业重金招聘Python工程师标准>>> 1. 目的 从string类型的字段中解析并汇总每种category类型的总amount 2. 素材 表名:test_tabl ...

  5. Hive UDF初探

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

  6. gearman mysql udf

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

  7. spark hive udf java_【填坑六】 spark-sql无法加载Hive UDF的jar

    /usr/custom/spark/bin/spark-sql --deploy-mode client add jar hdfs://${clusterName}/user/hive/udf/udf ...

  8. php backdoor creator encoder,Raven2 渗透(phpmailer漏洞+UDF提权)

    本帖最后由 Ybwh 于 2020-7-19 01:05 编辑 本文原创作者Ybwh,本文属i春秋原创奖励计划,未经许可禁止转载! 开机后扫描网段拿到ip地址 clipboard2.png (73.9 ...

  9. T-SQL: 17 个与日期时间相关的自定义函数(UDF),周日作为周的最后一天,均不受 @@DateFirst、语言版本影响...

    CSDN 的 Blog 太滥了!无时不刻地在坏! 开始抢救性搬家 ... ... 到这里重建家园 /* T-SQL: 17 个与日期时间相关的自定义函数(UDF),周日作为周的最后一天,均不受 @@D ...

  10. Spark UDF用户自定义函数

    自定义一个函数实现查询字符串长度.首先创建测试的DataFrame: val spark = SparkSession.builder().master("local").appN ...

最新文章

  1. 数据结构 -- 队列
  2. 图解WebGLThree.js工作原理【转】
  3. 大型网站架构演化历程
  4. Oracle 跨库查询表数据(不同的数据库间建立连接)
  5. 阿里云 超级码力在线编程大赛初赛 第2场 题目1. 三角魔法
  6. 告别并不遥远的儿时,抬眼期待未来
  7. python实现规则引擎_python – 如何在不使用eval()或exec()的情况下创建规则引擎?...
  8. 【自然语言处理】1.中文语言的机器处理
  9. 零基础学启发式算法(5)-遗传算法 (Genetic Algorithm)
  10. n阶方阵的蛇形排列java_排列组合的模板算法
  11. 基于WebAssembly 的H.265播放器研发
  12. 钢笔工具(贝塞尔曲线)
  13. 1756冗余_冗余电源1756-PA75R
  14. java pdf转jpg清晰度_java 库 pdfbox 将 pdf 文件转换成高清图片方法
  15. Android息屏状态下启动App
  16. provide和inject 用法
  17. google文件出错啦,发生浏览器错误!
  18. libxml2常用库函数详解
  19. 30个源码网站的网址
  20. 云南毒贩越狱出逃 监狱安防漏洞都在哪儿?

热门文章

  1. div内文本(text)居中对齐
  2. Android 动态调试和JEB启动调试命令
  3. 浅谈MyBatis源码工具类之——Reflector类
  4. hive外部表改为内部表_Hive基础之创建表
  5. matlab在数学教学,Matlab在数学函数教学中的应用
  6. 【彩蛋】小白入门学习 SQL 数据库基础视频教程(109个视频)
  7. python 连接mysql视频教程_Python操作MySQL视频教程
  8. 一款好用的日报管理系统“拍了拍”你,手把手教你如何写日报
  9. 用友nc java_用友NC系统使用过程中常见问题和解决方法!收藏!
  10. 安装SQL2005出现服务器启动失败或者安装后启动服务器失败的原因及解决方法