• Hive如何使用Java自定义函数


    流程

    1.java 继承UDF类编写udf函数(evaluate())(一个类一个方法)
    2.打fat包(包括所有依赖文件)
    3.把jar包放到linux上

    • 临时udf函数

    1.在hive命令行中使用add jar jar包路径即可加载到临时系统中
    2.create temporary function 函数名() as ‘方法的全类名’

    • 永久udf函数

    1.在liunx命令行使用hdfs命令把jar包上传到hdfs路径
    2.create function 函数名 as ‘方法的全类名’using jar ‘jar包的hdfs路径’;

    准备

    首先创建maven工程在这里插入图片描述

    在打上勾,选择
    在这里插入图片描述

    pom.xml 里面输入

      <dependency>
          <groupId>org.apache.hadoopgroupId>
          <artifactId>hadoop-commonartifactId>
          <version>2.6.0version>
        dependency>
        <dependency>
          <groupId>org.apache.hivegroupId>
          <artifactId>hive-execartifactId>
          <version>1.2.1version>
        dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    上面的jdk需要和本机的jdk版本一至

    1.在一个时间基础上进行小时的加减得到新的时间

    package cn.kgc.kb09.udf;
    
    import org.apache.hadoop.hive.ql.exec.UDF;
    import org.apache.hadoop.io.IntWritable;
    import org.apache.hadoop.io.Text;
    
    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    import java.util.Date;
    
    /**
     * @Author :Ersan
     * @Date 2020/9/22
     * @Description
     */
    public class AddHour extends UDF {
        public Text evaluate(Text beforeDate, IntWritable hours) throws Exception{
            //把接收到的字符串和整形转成java的类型
            String d=beforeDate.toString();
            String[] dAndT = d.split(" ");
            String[] day = dAndT[0].split("-");
            String[] time = dAndT[1].split(":");
            SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Date date = sdf.parse(d);
            String rst = sdf.format(new Date(date.getTime() + hours.get() * 60 * 60 * 1000));
            return new Text(rst);
        }
        public static void main(String[] args) throws Exception{
            AddHour ah=new AddHour();
            Text t=new Text("2020-09-22 10:20:00");
            IntWritable iw =new IntWritable(3);
            System.out.println(ah.evaluate(t, iw));
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    java main方法的结果:

    2020-09-22 13:20:00

    2.计算两个时间的时间差(小时差)

    package cn.kgc.kb09.udf;
    
    import org.apache.hadoop.hive.ql.exec.UDF;
    import org.apache.hadoop.io.IntWritable;
    import org.apache.hadoop.io.Text;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    /**
     * @Author :Ersan
     * @Date 2020/9/22
     * @Description
     */
    public class HourDiff extends UDF {
        public IntWritable evaluate(Text date1,Text date2)throws Exception{
            String d1 = date1.toString();
            String d2 = date2.toString();
            SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Date dt1 = sdf.parse(d1);
            Date dt2 = sdf.parse(d2);
            long diff = dt1.getTime() - dt2.getTime();
            int rst=(int)(diff/1000/60/60);
            return new IntWritable(rst);
        }
    
        public static void main(String[] args) throws Exception{
            HourDiff hd=new HourDiff();
            System.out.println(hd.evaluate(new Text("2020-09-21 12:00:00"), new Text("2020-09-22 23:00:00")));
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    java main方法的结果:

    -35

    运行

    1.把jar包导入到linux里面(我这里连同main方法一起打过来了)
    所以需要在linux里面把jar包中的main方法删除(没有main方法也需要以下操作,至少我这里试过):

    zip -d jar包地址 'META-INF/.RSA' 'META-INF/*SF'
    
    • 1

    当然需要提前下载zip:

    yum -y install zip

    2.把linux中的jar包上传到hdfs(为下面的永久udf函数做准备)
    3.打开hive

    • 创建临时udf函数

    1.add jar jar包全路径;
    2.create temporary function 方法名 as ‘方法的全类名(cn.kgc.kb09.udf.AddHour)’;
    3.使用函数方法: select 方法名(“参数”);

    • 创建永久udf函数

    1.create function 函数名 as ‘方法的全类名’ using jar ‘jar包的hdfs路径’;
    2.使用函数方法: select 方法名(“参数”);

  • 相关阅读:
    秋招突击——6/10——复习{(树形DP)树的最长路径、}——新作{电话号码的字母组合}
    anaconda、python卸载后重装以及anaconda--443
    SA8650 camx pipeline node xml 配置信息
    falsk框架中安装flask-mysqldb报错解决方案
    Linux上如何部署SpringBoot项目——手把手教会你
    关于软件设计师考试中的算法
    Python3 面向对象,一篇就够了
    HarmonyOS开发案例:【闹钟】
    社交网络分析重要概念简介、相关资料和前沿研究(持续更新ing...)
    C++静态成员(static)
  • 原文地址:https://blog.csdn.net/lz_N_one/article/details/126056243