代码
在处理一些业务场景下的数据时,我们需要按照日期范围将日期补全,来实现某些业务场景下的需求。
我们需要的是,传入开始时间和结束时间,返回一个日期数组。hive原生函数里没有这种功能。所以我们需要自己来编写udf来实现。代码如下
package com.zjs.udf;
import org.apache.hadoop.hive.ql.exec.UDF;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
/**
* Created by Administrator on 2017/9/25.
*/
public class FillDate extends UDF {
public ArrayList<String> evaluate(String str1, String str2) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date1 = sdf.parse(str1);
Date date2 = sdf.parse(str2);
int ch = (int) (date2.getTime() - date1.getTime()) / 1000 / (24 * 60 * 60);
ArrayList<String> strs = new ArrayList<String>();
int a;
for (a = 0; a < ch; a++) {
strs.add(sdf.format(date1.getTime() + 1000 * 24 * 60 * 60 * a));
}
return strs;
}
}
测试
创建函数
add jar /home/inf/zhangjishuai/udf/FillDate.jar;
create temporary function fill_date as 'com.zjs.udf.FillDate';
测试
hive> select fill_date("2017-09-26","2017-10-02");
OK
["2017-09-26","2017-09-27","2017-09-28","2017-09-29","2017-09-30","2017-10-01"]
结合原生udtf函数explode测试
hive> select explode(fill_date("2017-09-26","2017-10-02"));
OK
2017-09-26
2017-09-27
2017-09-28
2017-09-29
2017-09-30
2017-10-01