zoukankan      html  css  js  c++  java
  • Hive的自定义函数

    功能:

    通过人的生日,算出人的生肖和星座。

    先在hive中创建一个表:

    往这表中导入数据:

    导入的数据为:

    可以成功查询:

    编写自定义函数代码:如下

     1 package cn.tendency.wenzhouhbase.UdfHive;
     2 
     3 import java.sql.Date;
     4 import java.util.Calendar;
     5 
     6 import org.apache.hadoop.hive.ql.exec.UDF;
     7 import org.apache.hadoop.io.IntWritable;
     8 import org.apache.hadoop.io.Text;
     9 
    10 public class MyZodiaAndC extends UDF{
    11     
    12     /**
    13      * 
    14      * @param date,注意,如果使用的参数是Date,必须是java.sql.Date,
    15      *           这里无法识别
    16      * @param type 1==>生肖,0==》星座
    17      * @return
    18      */
    19      public Text evaluate(Date date, IntWritable type) {
    20          if(type.get() == 1) { //生肖
    21              return new Text(getZodica(date));
    22          } else if(type.get() == 0) { //星座
    23              return new Text(getConstellation(date));             
    24          } else {
    25              return null;
    26          }
    27      }
    28      
    29      public  final String[] zodiacArr = { "猴", "鸡", "狗", "猪", "鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊" };
    30      
    31      public  final String[] constellationArr = { "水瓶座", "双鱼座", "白羊座", "金牛座", "双子座", "巨蟹座", "狮子座", "处女座", "天秤座", "天蝎座", "射手座", "魔羯座" };
    32       
    33      public  final int[] constellationEdgeDay = { 20, 19, 21, 21, 21, 22, 23, 23, 23, 23, 22, 22 };
    34       
    35      /**
    36       * 根据日期获取生肖
    37       * @return
    38       */
    39      public  String getZodica(java.util.Date date) {
    40          Calendar cal = Calendar.getInstance();
    41          cal.setTime(date);
    42          return zodiacArr[cal.get(Calendar.YEAR) % 12];
    43      }
    44       
    45      /**
    46       * 根据日期获取星座
    47       * @return
    48       */
    49      public String getConstellation(java.util.Date date) {
    50          if (date == null) {
    51              return "";
    52          }
    53          Calendar cal = Calendar.getInstance();
    54          cal.setTime(date);
    55          int month = cal.get(Calendar.MONTH);
    56          int day = cal.get(Calendar.DAY_OF_MONTH);
    57          if (day < constellationEdgeDay[month]) {
    58              month = month - 1;
    59          }
    60          if (month >= 0) {
    61              return constellationArr[month];
    62          }
    63          // default to return 魔羯
    64          return constellationArr[11];
    65      }
    66     
    67 //     public void test() {
    68 //         
    69 //         System.out.println(getConstellation(new java.util.Date()));
    70 //         System.out.println(getZodica(new java.util.Date()));
    71 //     }
    72      
    73 }

     打包:

    把包上传到HiveUdfJar目录下:

    把jar包添加到hive中:

    创建临时函数shengxiao:

    查询:

    好了!这个自定义函数完成了。

  • 相关阅读:
    [转]快速矩阵快速幂
    继续学习C:数字进制表示
    pthread_cond_wait()用法分析
    [原]NYOJ-光棍的yy-655
    [原]NYOJ-组合数-32
    [转]_int64、long long 的区别
    [原]NYOJ-6174问题-57
    [转]sscanf函数具体用法
    [原]NYOJ-A*B Problem II-623
    集存款(复利单利)贷款为一体的计算器(最新版)
  • 原文地址:https://www.cnblogs.com/kwzblog/p/7485609.html
Copyright © 2011-2022 走看看