[Hive举例]-- hive获取今天、昨天、明天和前一个小时、后一个小时的日期

    xiaoxiao2022-06-30  68

    主题:解决hive获取今天、昨天、明天的日期的问题

    注意:由于hive内置函数中,没有提供获取昨天和明天的日期函数,所以需要编写自定义函数去实现

     

    1、获取今天时间(格式可以自定义)

    语句:

    select from_unixtime(unix_timestamp(),'yyyy-MM-dd HH:mm:ss')

    返回结果:

    2016-09-14 16:21:59

    2、获取昨天、明天时间(需要编写UDF自定义函数)

     

    (1)此处不大篇幅讲解编写hive udf的buzz,如需查看详细,请见:http://blog.csdn.net/high2011/article/details/52425430

    (2)此处只讲实现udf的java代码如下:

     

    import org.apache.hadoop.hive.ql.exec.UDF; import org.apache.hadoop.io.Text; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; /** * Document:本类作用---->获取明天或者昨天时间 * User: yangjf * Date: 2016/9/14 16:26 */ public class NextDay extends UDF { public String evaluate(int i) { Date date=new Date();//取时间 Calendar calendar = new GregorianCalendar(); calendar.setTime(date); calendar.add(calendar.DATE,i);//把日期往后增加一天.整数往后推,负数往前移动,0代表今天的时间 date=calendar.getTime(); //这个时间就是日期往后推一天的结果 SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String dateString = formatter.format(date); return dateString; } public static void main(String[] args) { System.out.println("今天时间:"+new NextDay().evaluate(0)); System.out.println("明天时间:"+new NextDay().evaluate(1)); System.out.println("昨天天时间:"+new NextDay().evaluate(-1)); } } /** * 结果:今天时间:2016-09-14 16:35:58 * 明天时间:2016-09-15 16:35:58 * 昨天时间:2016-09-13 16:35:58 * /

     

     

     

    (3)在hive中注册临时函数:"getMyDate"

    (4)使用函数:

    获取今天时间----》select   getMyDate(0);

    2016-09-14 16:38:31 获取明天时间----》select   getMyDate(1);

    2016-09-15 16:38:31 获取昨天时间----》select   getMyDate(-1);

    2016-09-13 16:38:31

     

    以上测试已经通过,可直接使用,如有疑问,请留言,欢迎各位批评指正!

     

    -----------------------------

    当然,如果小伙伴们不想使用udf,只是想获取 yyyy-MM-dd 格式的日期,那么可以这样:

    date_add('2008-12-31', 1) = '2009-01-01'.

    date_sub(current_date ,1) = 昨天的日期(yyyy-MM-dd)

    -----------------------------

    补充下:获取前 n 个小时或者后 n 个小时的时间

    3600=60 * n

    select hour(from_unixtime(unix_timestamp(date_format(current_timestamp,'yyyy-MM-dd HH:mm:ss') )-3600));

    返回值是 int 

    -----------------------------

     

     

     

    转载请注明原文地址: https://ju.6miu.com/read-1125807.html

    最新回复(0)