概述
流水号组成:
公司代码 + 日期(YYYYMMDD) + 10位流水,流水号是每天的流水号,每天都是从‘0000000001’开始。其中日期为上月最后一天日期。
1.UDF函数
首先建一个maven工程,在pom.xml导入依赖包
pom.xml
<dependencies>
<!--添加hadoop依赖-->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>3.1.1</version>
</dependency>
<!--添加hive依赖-->
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>3.1.1</version>
</dependency>
</dependencies>
编写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 使用UDF函数生成流水号的全部内容,希望文章能够帮你解决hive 使用UDF函数生成流水号所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复