`
乡里伢崽
  • 浏览: 108626 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

hive udaf

    博客分类:
  • hive
 
阅读更多
package com.lwz.udaf;

import org.apache.hadoop.hive.ql.exec.UDAF;
import org.apache.hadoop.hive.ql.exec.UDAFEvaluator;
//1.此函数区分一条记录的方法,如果没有group by和where的检索,那么整个表的数据都会被作为一条数据,从而只会init()一次
//然后再把这条数据根据表里面的行数依次进行iterator(),再把iterator()方法返回的结果通过terminatePartial()返回,当再次
//进行iterator()时,结果就会累加,当最后通过terminate()返回,那么此条记录也就处理完成
//2.如果hql中有group by,那么整张表就会被分为几条记录,而且每次处理新记录前都会被init()一次,其余的每个步骤都和上一样
public class MyConcat extends UDAF {
public static class ConcatUDAFEvaluator implements UDAFEvaluator{
  public static class PartialResult{
   String result;
   String delimiter;
  }
  private PartialResult partial;
  //初始化每条记录
  public void init() {
  //每次初始化就是将partial置为空
   partial = null;
  }
  //根据数据的行数轮转调用iterate方法
  public boolean iterate(String id,String name,String deli){
  
   if (name == null||id==null){
//如果传入的参数为空
    return true;
   }
   if (partial == null){
//如果部分结果输出为空,说明是开始读入新的一条记录或者是第一条记录
    partial = new PartialResult();
    //给partial结果赋值
    partial.result = new String("");
    if(  deli == null || deli.equals("") )
    {
    //如果分隔符为空或者为"",给partial赋予默认分隔符","
     partial.delimiter = new String(",");
    }
    else
    {
    //如果分隔符不为空,则把传入的分隔符赋予partial的delimiter
     partial.delimiter = new String(deli);
    }
       
   }
   if ( partial.result.length() > 0 )
   {
//如果partial的结果不为空,则在将结果加上分隔符
    partial.result = partial.result.concat(partial.delimiter);
   }
   //将加上分隔符的结果和新传入进行整合
   partial.result = partial.result.concat(name).concat(id);
  
   return true;
  }
  //返回轮转的结果
  public PartialResult terminatePartial(){
//将每条记录处理完的结果返回
   return partial;
  }
  //合并terminatePartial()返回的结果
  public boolean merge(PartialResult other){
   if (other == null){
    return true;
   }
   if (partial == null){
    partial = new PartialResult();
    partial.result = new String(other.result);
    partial.delimiter = new String(other.delimiter);
   }
   else
   {  
    if ( partial.result.length() > 0 )
    {
     partial.result = partial.result.concat(partial.delimiter);
    }
    partial.result = partial.result.concat(other.result);
   }
   return true;
  }
  //返回最终聚合的结果
  public String terminate(){
   return new String(partial.result);
  }
}
}

•一下两个包是必须的import org.apache.hadoop.hive.ql.exec.UDAF和 org.apache.hadoop.hive.ql.exec.UDAFEvaluator
开发步骤
•函数类需要继承UDAF类,内部类Evaluator实UDAFEvaluator接口
•Evaluator需要实现 init、iterate、terminatePartial、merge、terminate这几个函数
a)init函数实现接口UDAFEvaluator的init函数。
b)iterate接收传入的参数,并进行内部的轮转。其返回类型为boolean。
c)terminatePartial无参数,其为iterate函数轮转结束后,返回轮转数据,terminatePartial类似于hadoop的Combiner。
d)merge接收terminatePartial的返回结果,进行数据merge操作,其返回类型为boolean。
e)terminate返回最终的聚集函数结果。
执行步骤
•执行求平均数函数的步骤
a)将java文件编译成Avg_test.jar。
b)进入hive客户端添加jar包:
hive>add jar /run/jar/Avg_test.jar。
c)创建临时函数:
hive>create temporary function avg_test 'hive.udaf.Avg';
d)查询语句:
hive>select avg_test(scores.math) from scores;
e)销毁临时函数:
hive>drop temporary function avg_test;
  • 大小: 184.2 KB
分享到:
评论

相关推荐

    hive udaf 实现按位取与或

    hive udaf 实现按位取与或 hive udaf 实现按位取与或 hive udaf 实现按位取与或

    Hive UDAF示例

    A custom UDAF to group oncatenates all arguments from different rows into a single string.

    hive:个人配置单元 UDAF

    个人 Hive UDAF 有一堆 Hive UDAF(用户定义的聚合函数)不在标准 Hive 分布中,因为它们可能会导致大型数据集的 OOM。 要使用它们,您需要加载 jar 文件,然后为每个要使用的函数创建一个临时函数: ADD JAR target...

    spark-window:Spark 窗口函数的实验

    本机 Spark-SQL,当前实现仅依赖于 Hive UDAF。 新的实现使用 Spark SQL 聚合。 虽然仍然支持 Hive UDAF。 在运行案例(例如 BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)和 UNBOUDED FOLLOWING 案例中,性能...

    自定义hive函数

    自定义 hive udf udaf 有url解析,获取网站主域名,根据ip获取区域码,有rownum,列聚合以及一些业务实现udf。

    mustached-hive-udfs:一些有用的 Hive UDF 和 UDAF

    这是一些有用的 Hive UDF 和 UDAF 的集合。 提供的功能 UDAF Mode ( de.frosner.hive.udaf.Mode ) - 计算组列的统计模式 从源头构建 git clone https://github.com/FRosner/mustached-hive-udfs.git cd mustached...

    【官网汉化中文】Hive函数运算符使用方法大全

    hive所有函数 包括UDTs、UDAF、UDTF函数和运算符等,中文汉化,翻译并测试

    hive常用函数

    hive常用函数,包括时间、类型、udf、udaf等等的归纳。

    赵伟:HIVE在腾讯分布式数据仓库实践

    赵伟首先介绍了他们的TDW核心架构,HIVE,MapReduce,HDFS及PostgreSQL构成。赵伟分享了最核心的HIVE模块在TDW中的实践经验;HIVE是一个在Hadoop上构建数据仓库的软件,它...实现了基本的SQL功能,可扩充UDF/UDAF...

    spark-hive-udf:Spark Hive UDF示例

    Spark Hive UDF示例 建立项目 mvn clean package 将spark-hive-udf-1.0.0-SNAPSHOT.jar复制到边缘节点临时目录 spark-hive-udf]# cp target/spark-hive-udf-1.0.0-SNAPSHOT.jar /tmp 通过提供罐子来启动火花壳 spark...

    Hive的基础操作教学

    Hive常用数据类型介绍,表创建,内外部表、分区分桶表介绍,hive内置函数,UDTF,UDAF函数介绍,hive数据的导入导出以及JDBC配置方法。详细介绍了hive一些函数的使用和应用。

    datasketches-hive:Hive的草图适配器

    =================适用于Apache Hive的DataSketches Java UDF / UDAF适配器请访问主要的以获取更多信息。 如果您有兴趣对此站点做出贡献,请参阅我们的页面以了解如何与我们联系。Hadoop Hive UDF / UDAF 请参阅Java...

    hive

    Apache Hive(TM)数据仓库软件有助于查询和... HiveQL还可以使用自定义标量函数(UDF),聚合(UDAF)和表函数(UDTF)进行扩展。https://mirrors.tuna.tsinghua.edu.cn/apache/hive/hive-standalone-metastore-3.0.0/

    young1lin#notes#使用 UDAF 计算两个数的线性回归系数1

    title: "使用 [通用] UDAF 计算两个数的线性回归系数"例如select s,regression(x,y) group by s;参考Hive U

    hive-udf:hive自定义函数

    hive-udfhive自定义函数主要实现hive3种自定义函数1,udf函数,主要用于处理一对一数据处理2,udtf函数,主要用于处理一对多数据处理2,udaf函数,主要用与处理多对一数据聚合处理

    hive-udf-tools:hive udf 部署工具,开发工具...

    调用 FunctionRegistry.registerUDAF 注册udaf 调用FunctionRegistry.registerUDTF 注册udtf 3 打包 mvn clean package 4 上传相应jar包到$HIVE_HOME/auxlib目录下 让hive自动加载udf包(该过程只需要一次执行,目前...

    Hive性能优化

    本文来自于cnblogs,赘述了在工作中总结Hive的常用优化手段和在工作中使用Hive出现的问题。下面开始本篇文章的优化介绍:继续《那些年使用Hive踩过的坑》一文中...sum,count,max,min等UDAF,不怕数据倾斜问题,hadoop在map

Global site tag (gtag.js) - Google Analytics