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

    Hive的自定义的函数的步骤:

    1°、自定义UDF extends org.apache.hadoop.hive.ql.exec.UDF

    2°、需要实现evaluate函数,evaluate函数支持重载

    3°、把程序打包放到目标机器上去

    4°、进入hive客户端,添加jar包:hive>add jar jar路径

    5°、创建临时函数:hive> create temporary function 自定义名称 AS '自定义UDF的全类名'

    6°、执行HQL语句;

    7°、销毁临时函数:hive> drop temporary function 自定义名称

    在hive的hive-exec-1.0.0.jar中有如下结构(这是Hive中的内嵌函数的源码):

    举一个例子:是<hive编程指南>中的一个经典案例.

    统计显示生效和星座

    输入日期显示字符串.

    如果是0就显示生肖,如果是1就显示星座.

    示例代码如下:

     1 import java.sql.Date;
     2 import java.text.SimpleDateFormat;
     3 import java.util.Calendar;
     4 
     5 import org.apache.hadoop.hive.ql.exec.UDF;
     6 import org.apache.hadoop.io.Text;
     7 import org.junit.Test;
     8 
     9 public class UDFZodiacAndConstellation extends UDF {
    10     public Text evaluate(Date date, int type) {
    11         // 这个地方Date的类型是java.sql.Date,和数据库打交道的都是这个.
    12         // 还可以用DateWritable,这个类面封装了一个java.sql.Date类型.
    13         java.util.Date uDate = new java.util.Date(date.getTime());
    14         if (type == 0) {// 生肖
    15             return new Text(getZodica(uDate));
    16         } else if (type == 1) {// 星座
    17             return new Text(getConstellation(uDate));
    18         } else {
    19             return new Text("NULL");
    20         }
    21     }
    22 
    23     public final String[] zodiacArr = { "猴", "鸡", "狗", "猪", "鼠", "牛", "虎", "兔","龙", "蛇", "马", "羊" };
    24     public final String[] constellationArr = { "水瓶座", "双鱼座", "白羊座", "金牛座","双子座", "巨蟹座", "狮子座", "处女座", 
    25             "天秤座", "天蝎座", "射手座", "魔羯座" };
    26     public final int[] constellationEdgeDay = { 20, 19, 21, 21, 21, 22, 23, 23,    23, 23, 22, 22 };
    27 
    28     /**
    29      * 根据日期获取生肖
    30      */
    31     public String getZodica(java.util.Date date) {
    32         Calendar cal = Calendar.getInstance();
    33         cal.setTime(date);
    34         return zodiacArr[cal.get(Calendar.YEAR) % 12];
    35     }
    36 
    37     /**
    38      * 根据日期获取星座
    39      */
    40     public String getConstellation(java.util.Date date) {
    41         if (date == null) {
    42             return "";
    43         }
    44         Calendar cal = Calendar.getInstance();
    45         cal.setTime(date);
    46         int month = cal.get(Calendar.MONTH);
    47         int day = cal.get(Calendar.DAY_OF_MONTH);
    48         if (day < constellationEdgeDay[month]) {
    49             month = month - 1;
    50         }
    51         if (month >= 0) {
    52             return constellationArr[month];
    53         }
    54         // default to return 魔羯
    55         return constellationArr[11];
    56     }
    57 
    58     /**
    59      * 测试方法
    60      */
    61     @Test
    62     public void test() throws Exception {
    63         System.out.println(getConstellation(new SimpleDateFormat("yyyy-MM-dd").parse("2016-07-09")));
    64         System.out.println(getConstellation(new SimpleDateFormat("yyyy-MM-dd").parse("2016-07-31")));
    65         System.out.println(getZodica(new SimpleDateFormat("yyyy-MM-dd").parse("2016-07-31")));
    66     }
    67 }

    然后对这个java文件打包放到Linux中,此处是放到了/usr/local/data/calc-cz.jar  

    show functions 能够找到这个创建的cz函数.

    查看该自定义函数的函数描述:

    在jar源代码包中看关于hive内置year函数的源码:

    可以仿照这个内置的函数在编写自定义hive函数的时候,定义函数的描述description.

    year函数在hive中的描述

    关于上面自定义的函数的在hive中的具体使用不再详述......

  • 相关阅读:
    类和对象
    使用JAVA理解程序逻辑
    类的有参
    1.人机猜拳
    类的无参方法
    类和对象
    Java解析XML
    集合框架一
    Java中的包
    继承
  • 原文地址:https://www.cnblogs.com/DreamDrive/p/5561113.html
Copyright © 2011-2022 走看看