hive 使用UDF函数生成流水号

流水号组成:

公司代码 + 日期(YYYYMMDD) + 10位流水,流水号是每天的流水号,每天都是从‘0000000001’开始。其中日期为上月最后一天日期。

1.UDF函数

首先建一个maven工程,在pom.xml导入依赖包

pom.xml


        
        
            org.apache.hadoop
            hadoop-common
            3.1.1
        
        
        
            org.apache.hive
            hive-exec
            3.1.1
        
    

编写udf函数

 SerialNumber.java

import org.apache.hadoop.hive.ql.exec.UDF;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;


public class SerialNumber extends UDF {

    IdBean t = new IdBean();
    StringBuffer buffer = new StringBuffer();


/*
* 公司代码+日期(YYYYMMDD)+10位流水,流水号是每天的流水号,每天都是从‘0000000001’开始。
* 其中日期为上报数据时当前的系统日期。*/


    public String evaluate(String bxjgdm){

        // 时间日期字符串处理(YYYYMMDD)
        Date date = new Date();
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        //获取上个月月份
        calendar.add(Calendar.MONTH,-1);
        //获取上个月最大天数
        calendar.set(Calendar.DATE,calendar.getActualMaximum(Calendar.DATE));
        //获取上个月最后一天
        date = calendar.getTime();
        //指定时间格式
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        CharSequence dateStr = sdf.format(date);

        //若为string类型,则使用切割字符串: String dateStr = date.substring(0,8);

        int i = t.getNum();

        /*
        // 当时间字符串为输入参数时,需进行判断
        if (buffer.toString().contains(dateStr)){
            //获取每次 +1 的自增数
            i++;
        }else{
            // 将新日期加入到 buffer 中
            buffer.append(dateStr + ",");
            //将 i 重置为 1
            i = 1;
        }
        */
        //返回 i 的值
        i++;
        t.setNum(i);

        // 获取 0000000000 与 自增数 的拼接数字字符串
        String str = "0000000000" + i;

        // 取数字字符串后10位拼接为流水号
        String id = bxjgdm + dateStr + str.substring(str.length()-10);

        return id;
    }

    public static void main(String[] args) {
        SerialNumber number = new SerialNumber();
        String s = number.evaluate("000093");
        String d = number.evaluate("000093");
        String f = number.evaluate("000093");
        String g = number.evaluate("000093");
        System.out.println(s);
        System.out.println(d);
        System.out.println(f);
        System.out.println(g);
    }

}

使用Javabean进行计数

IdBean

public class IdBean {
    private int num = 0;

    public IdBean(){
        super();
    }

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }

}

2.项目打包上传并执行

在maven选项中clean ---> package ---> 复制target中的jar包到桌面 ---> 上传到Linux 上hive目录下 --->  在hive环境添加jar包  ---> 创建相应函数  --->  运行 ---> ok

//添加jar包到hive环境
add jar /opt/modules/hive-3.1.1/mylib/LiuShuiHao-1.0-SNAPSHOT.jar;

//创建临时函数
create temporary function Lsh as 'SerialNumber';


//测试执行
hive> select name,Lsh(birthday) from test01;
OK
张三    20211122202106300000000001
李四    20211123202106300000000002
王五    20211122202106300000000003
赵六    20211125202106300000000004
Jack    20211122202106300000000005
Tom     20211122202106300000000006
Li.see  20211127202106300000000007
John jeery      20211126202106300000000008
Time taken: 0.444 seconds, Fetched: 8 row(s)

udf具体操作:

https://blog.csdn.net/u010003835/article/details/81061563

你可能感兴趣的:(hive,hive)