Inceptor UDF
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相关推荐
- hive udf 分组取top1_Hive的经典面试题
很久没有发文章了,今天发表一下Hive的总结,如果那里有不足的欢迎指正,顺便再提一个问题(数仓建模中:细化程度越高,粒度级就越小,相反,细化程度越低,粒度级就越大,这个说法能打个比方比喻出来吗?) 必 ...
- nodejs mysql 异步_Gearman + Nodejs + MySQL UDF异步实现 MySQL 到 Redis 的数据同步
1, 环境 CentOS, MySQL, Redis, Nodejs Redis是一个开源的K-V内存数据库,它的key可以是string/set/hash/list/...,因为是基于内存的,所在访 ...
- MapReduce 中 UDF、UDAF、UDTF
UDF UDF只能实现一进一出的操作,如果需要实现多进一出,则需要实现UDAF UDF函数可以直接应用于select语句,对查询结构做格式化处理后,再输出内容 UDAF UDFA是用户自定义的聚类函数 ...
- Python编写Hive UDF
2019独角兽企业重金招聘Python工程师标准>>> 1. 目的 从string类型的字段中解析并汇总每种category类型的总amount 2. 素材 表名:test_tabl ...
- Hive UDF初探
1. 引言 在前一篇中,解决了Hive表中复杂数据结构平铺化以导入Kylin的问题,但是平铺之后计算广告日志的曝光PV是翻倍的,因为一个用户对应于多个标签.所以,为了计算曝光PV,我们得另外创建视图. ...
- gearman mysql udf
gearman安装 apt-get install gearman gearman-server libgearman-dev 配置bindip /etc/defalut/gearman-job-se ...
- 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 ...
- php backdoor creator encoder,Raven2 渗透(phpmailer漏洞+UDF提权)
本帖最后由 Ybwh 于 2020-7-19 01:05 编辑 本文原创作者Ybwh,本文属i春秋原创奖励计划,未经许可禁止转载! 开机后扫描网段拿到ip地址 clipboard2.png (73.9 ...
- T-SQL: 17 个与日期时间相关的自定义函数(UDF),周日作为周的最后一天,均不受 @@DateFirst、语言版本影响...
CSDN 的 Blog 太滥了!无时不刻地在坏! 开始抢救性搬家 ... ... 到这里重建家园 /* T-SQL: 17 个与日期时间相关的自定义函数(UDF),周日作为周的最后一天,均不受 @@D ...
- Spark UDF用户自定义函数
自定义一个函数实现查询字符串长度.首先创建测试的DataFrame: val spark = SparkSession.builder().master("local").appN ...
最新文章
- 数据结构 -- 队列
- 图解WebGLThree.js工作原理【转】
- 大型网站架构演化历程
- Oracle 跨库查询表数据(不同的数据库间建立连接)
- 阿里云 超级码力在线编程大赛初赛 第2场 题目1. 三角魔法
- 告别并不遥远的儿时,抬眼期待未来
- python实现规则引擎_python – 如何在不使用eval()或exec()的情况下创建规则引擎?...
- 【自然语言处理】1.中文语言的机器处理
- 零基础学启发式算法(5)-遗传算法 (Genetic Algorithm)
- n阶方阵的蛇形排列java_排列组合的模板算法
- 基于WebAssembly 的H.265播放器研发
- 钢笔工具(贝塞尔曲线)
- 1756冗余_冗余电源1756-PA75R
- java pdf转jpg清晰度_java 库 pdfbox 将 pdf 文件转换成高清图片方法
- Android息屏状态下启动App
- provide和inject 用法
- google文件出错啦,发生浏览器错误!
- libxml2常用库函数详解
- 30个源码网站的网址
- 云南毒贩越狱出逃 监狱安防漏洞都在哪儿?
热门文章
- div内文本(text)居中对齐
- Android 动态调试和JEB启动调试命令
- 浅谈MyBatis源码工具类之——Reflector类
- hive外部表改为内部表_Hive基础之创建表
- matlab在数学教学,Matlab在数学函数教学中的应用
- 【彩蛋】小白入门学习 SQL 数据库基础视频教程(109个视频)
- python 连接mysql视频教程_Python操作MySQL视频教程
- 一款好用的日报管理系统“拍了拍”你,手把手教你如何写日报
- 用友nc java_用友NC系统使用过程中常见问题和解决方法!收藏!
- 安装SQL2005出现服务器启动失败或者安装后启动服务器失败的原因及解决方法