HiveカスタムUDF関数--一般的なツールクラス

28485 ワード

関数の登録:
カスタム関数をjarパッケージにしてhdfsをアップロード
$hive>create function formattime as 'com.air.udf.FormatTimeUDF' using jar 'hdfs://mycluster/user/centos/air-hive-1.0-SNAPSHOT.jar'
次の操作を行います.
$hive>select formattime(datatime,'yyyy/MM/dd') day   from test where datatime>= getDaybegin() and datatime< getDaybegin(1) ;
カスタム関数:
1,long型のタイムスライスを指定した日付フォーマットにフォーマットする
import org.apache.hadoop.hive.ql.exec.Description;
import org.apache.hadoop.hive.ql.exec.UDF;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 *  long               
 */
@Description(name = "udf_formattime",
      value = "formattime",
      extended = "formattime() ;\r
" + " formattime(1234567,'yyyy/MM/01') \r
" + " formattime('1234567','yyyy/MM/dd')") public class FormatTimeUDF extends UDF { /** * ,long */ public String evaluate(long ms,String fmt) throws ParseException { SimpleDateFormat sdf = new SimpleDateFormat(fmt) ; Date d = new Date(); d.setTime(ms); return sdf.format(d) ; } /** * string */ public String evaluate(String ms,String fmt) throws ParseException { SimpleDateFormat sdf = new SimpleDateFormat(fmt) ; Date d = new Date(); d.setTime(Long.parseLong(ms)); return sdf.format(d) ; } /** * string */ public String evaluate(long ms ,String fmt , int week) throws ParseException { Date d = new Date(); d.setTime(ms); // Date firstDay = DateUtil.getWeekBeginTime(d) ; SimpleDateFormat sdf = new SimpleDateFormat(fmt) ; return sdf.format(firstDay) ; } }

2、今日の開始時間を取得します.
import org.apache.hadoop.hive.ql.exec.Description;
import org.apache.hadoop.hive.ql.exec.UDF;

import java.text.SimpleDateFormat;
import java.util.Date;

@Description(name = "udf_getdaybegin",
        value = "getdaybegin",
        extended = "getdaybegin() ;\r
" + " getdaybegin(2) \r
" + " getdaybegin('2017/06/29 01:02:03') \r
" + " getdaybegin('2017/06/29 01:02:03',2) \r
" + " getdaybegin(date_obj) \r
" + " getdaybegin(date_obj,2)") public class DayBeginUDF extends UDF{ /** * ( ) */ public long evaluate(){ return DateUtil.getDayBeginTime(new Date()).getTime(); } public long evaluate(Date d){ return DateUtil.getDayBeginTime(d).getTime(); } public long evaluate(int offset){ return DateUtil.getDayBeginTime(new Date(),offset).getTime(); } public long evaluate(Date d,int offset){ return DateUtil.getDayBeginTime(d,offset).getTime(); } public long evaluate(String dateStr) throws Exception{ SimpleDateFormat df = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); Date d = df.parse(dateStr); return evaluate(d); } public long evaluate(String dateStr,int offset) throws Exception{ SimpleDateFormat df = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); Date d = df.parse(dateStr); return evaluate(d,offset); } public long evaluate(String dateStr,String fmt) throws Exception{ SimpleDateFormat df = new SimpleDateFormat(fmt); Date d = df.parse(dateStr); return evaluate(d); } public long evaluate(String dateStr,int offset, String fmt) throws Exception{ SimpleDateFormat df = new SimpleDateFormat(fmt); Date d = df.parse(dateStr); return evaluate(d,offset); } }
 
  

工具类:

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class DateUtil {
   /**
    *     date    .
    */
   public static Date getDayBeginTime(Date d) {
      try {
         SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd 00:00:00");
         return sdf.parse(sdf.format(d));
      } catch (Exception e) {
         e.printStackTrace();
      }
      return null;
   }

   /**
    *     date       .
    */

   public static Date getDayBeginTime(Date d,int offset) {
      try {
         Date date=getDayBeginTime(d);
         Calendar c = Calendar.getInstance();
         c.setTime(date);
         c.add(Calendar.DAY_OF_MONTH,offset);
         return c.getTime();
      } catch (Exception e) {
         e.printStackTrace();
      }
      return null;
   }

   /**
    *     date        .
    */
   public static Date getWeekBeginTime(Date d) {
      try {
         Date date=getDayBeginTime(d);
         Calendar c = Calendar.getInstance();
         c.setTime(date);
         int i = c.get(Calendar.DAY_OF_WEEK);
         c.add(Calendar.DAY_OF_MONTH,-(i-1));
         return c.getTime();
      } catch (Exception e) {
         e.printStackTrace();
      }
      return null;
   }
   /**
    *     date        .
    */
   public static Date getWeekEndTime(Date d) {
      try {
         Date date=getDayBeginTime(d);
         Calendar c = Calendar.getInstance();
         c.setTime(date);
         int i = c.get(Calendar.DAY_OF_WEEK);
         c.add(Calendar.DAY_OF_MONTH,(8-i));
         return c.getTime();
      } catch (Exception e) {
         e.printStackTrace();
      }
      return null;
   }
   /**
    *     date        .
    */
   public static Date getWeekEndTime(Date d,int offset) {
      try {
         Date date=getDayBeginTime(d);
         Calendar c = Calendar.getInstance();
         c.setTime(date);
         int i = c.get(Calendar.DAY_OF_WEEK);
         c.add(Calendar.DAY_OF_MONTH,(8-i));
         c.add(Calendar.DAY_OF_MONTH,offset*7);
         return c.getTime();
      } catch (Exception e) {
         e.printStackTrace();
      }
      return null;
   }

   /**
    *     date        .
    */
   public static Date getWeekBeginTime(Date d,int offset) {
      try {
         Date date=getDayBeginTime(d);
         Calendar c = Calendar.getInstance();
         c.setTime(date);
         int i = c.get(Calendar.DAY_OF_WEEK);
         c.add(Calendar.DAY_OF_MONTH,-(i-1));
         c.add(Calendar.DAY_OF_MONTH,offset*7);
         return c.getTime();
      } catch (Exception e) {
         e.printStackTrace();
      }
      return null;
   }
   /**
    *     date        .
    */
   public static Date getMonthBeginTime(Date d ) {
      try {
         Date date=getDayBeginTime(d);
         Calendar c = Calendar.getInstance();
         c.setTime(date);
         int i = c.get(Calendar.DAY_OF_MONTH);
         c.add(Calendar.DAY_OF_MONTH,-(i-1));
         return c.getTime();
      } catch (Exception e) {
         e.printStackTrace();
      }
      return null;
   }
   /**
    *     date        .
    */
   public static Date getMonthBeginTime(Date d,int offset) {
      try {
         Date date=getDayBeginTime(d);
         Calendar c = Calendar.getInstance();
         c.setTime(date);
         int i = c.get(Calendar.DAY_OF_MONTH);
         c.add(Calendar.DAY_OF_MONTH,-(i-1));
         c.add(Calendar.MONTH,offset);
         return c.getTime();
      } catch (Exception e) {
         e.printStackTrace();
      }
      return null;
   }

}