流水号组成:
公司代码 + 日期(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
|