今天使用阿里云套件quick bi开发一个报表,需求是自定义上周六到本周五为自然周来统计周指标,常规日期函数已经不能满足此需求,需自定义UDF函数来实现,具体解决过程如下。
知识储备:
我们知道hive有一个日期转周函数:weekofyear
语法: weekofyear (string date)
返回值: int
说明:返回日期在当前的周数,默认周一是一周的开始。
举例:
hive> select weekofyear('2020-12-29')
53
此需求的核心就是重写weekofyear这个方法,传入参数周六作为一周的开始时间,周五就作为结束时间,有了这个思路我们就开始自定义UDF函数。
笔者使用的是阿里云的DataWorks一站式开发平台,代码开发工具是Idea,下面详细介绍实现过程:
1、创建maven项目
2、pom.xml导入阿里云依赖
<dependencies>
<dependency>
<groupId>com.aliyun.odps</groupId>
<artifactId>odps-sdk-udf</artifactId>
<version>0.29.10-public</version>
</dependency>
</dependencies>
3、继承UDF,重写evaluate方法,写入核心逻辑
public String evaluate(Date s, String firstDayOfWeek) {
LocalDate localDate = LocalDateTime.ofInstant(s.toInstant(), ZoneId.systemDefault()).toLocalDate();
WeekFields weekFields = WeekFields.of(DayOfWeek.of(Integer.parseInt(firstDayOfWeek)), 4);
return String.format("%04d-%02d", localDate.get(weekFields.weekBasedYear()), localDate.get(weekFields.weekOfWeekBasedYear()));
}
4、本地测试,测试时间为2023-06-26,假如周六作为一周的开始,则是本年第26周
6、打包
7、以下步骤在dataworks完成,选择项目空间后,在资源处新建jar,并上传jar包
8、注册函数
9、使用