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就显示星座.

    示例代码如下:

    import java.sql.Date;
    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    
    import org.apache.hadoop.hive.ql.exec.UDF;
    import org.apache.hadoop.io.Text;
    import org.junit.Test;
    
    public class UDFZodiacAndConstellation extends UDF {
        public Text evaluate(Date date, int type) {
            // 这个地方Date的类型是java.sql.Date,和数据库打交道的都是这个.
            // 还可以用DateWritable,这个类面封装了一个java.sql.Date类型.
            java.util.Date uDate = new java.util.Date(date.getTime());
            if (type == 0) {// 生肖
                return new Text(getZodica(uDate));
            } else if (type == 1) {// 星座
                return new Text(getConstellation(uDate));
            } else {
                return new Text("NULL");
            }
        }
    
        public final String[] zodiacArr = { "猴", "鸡", "狗", "猪", "鼠", "牛", "虎", "兔","龙", "蛇", "马", "羊" };
        public final String[] constellationArr = { "水瓶座", "双鱼座", "白羊座", "金牛座","双子座", "巨蟹座", "狮子座", "处女座", 
                "天秤座", "天蝎座", "射手座", "魔羯座" };
        public final int[] constellationEdgeDay = { 20, 19, 21, 21, 21, 22, 23, 23,    23, 23, 22, 22 };
    
        /**
         * 根据日期获取生肖
         */
        public String getZodica(java.util.Date date) {
            Calendar cal = Calendar.getInstance();
            cal.setTime(date);
            return zodiacArr[cal.get(Calendar.YEAR) % 12];
        }
    
        /**
         * 根据日期获取星座
         */
        public String getConstellation(java.util.Date date) {
            if (date == null) {
                return "";
            }
            Calendar cal = Calendar.getInstance();
            cal.setTime(date);
            int month = cal.get(Calendar.MONTH);
            int day = cal.get(Calendar.DAY_OF_MONTH);
            if (day < constellationEdgeDay[month]) {
                month = month - 1;
            }
            if (month >= 0) {
                return constellationArr[month];
            }
            // default to return 魔羯
            return constellationArr[11];
        }
    
        /**
         * 测试方法
         */
        @Test
        public void test() throws Exception {
            System.out.println(getConstellation(new SimpleDateFormat("yyyy-MM-dd").parse("2016-07-09")));
            System.out.println(getConstellation(new SimpleDateFormat("yyyy-MM-dd").parse("2016-07-31")));
            System.out.println(getZodica(new SimpleDateFormat("yyyy-MM-dd").parse("2016-07-31")));
        }
    }

    然后对这个java文件打包放到Linux中,

    javac 

    此处是放到了/usr/local/data/calc-cz.jar  

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

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

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

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

    year函数在hive中的描述

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

    关注公众号 海量干货等你
  • 相关阅读:
    app令牌的一个token实现
    velocity分页模板
    js基础-表单验证和提交
    做项目中没经验遇到的各种问题
    No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?
    oracle创建用户
    oracle创建表相关
    pe创建激活administrator后消除问题,删除用户问题
    spring学习遇到的问题汇总
    .NET MVC自定义错误处理页面的方法
  • 原文地址:https://www.cnblogs.com/sowhat1412/p/12734255.html
Copyright © 2011-2022 走看看