Hive中UDF编程

开发 UDF 步骤,实现小写转大写

  1. pom.xml 加入Hive 依赖JAR包
  2. 创建类

    1. 继承UDF
    2. 方式名称: evaluate
    3. 返回值不能为null
    4. 一定要测试
  3. 代码

    package om.beifeng.bigdata;
    import org.apache.commons.lang.StringUtils;
    import org.apache.hadoop.hive.ql.exec.UDF;
    import org.apache.hadoop.io.Text;
    
    /**
     *
     * Step 1:
     *      1. Implement one or more methods named "evaluate" which will be called by Hive.
     *      2."evaluate" should never be a void method. However it can return "null" if needed.
     *
     */
    public class LowUDF extends UDF{
    
        /**
         * 实现单词转换为小写字母
         *
         * @param str
         * @return
         */
        public Text evaluate(Text str){
            // invalidate
            if(null == str){
                return null ;
            }
    
            if(StringUtils.isBlank(str.toString())){
                return null ;
            }
            // 转小写
            return new Text(str.toString().toLowerCase()) ;
        }
    
        public static void main(String[] args) {
            System.out.println(new LowUDF().evaluate(new Text("HADOOOOO")));
        }
    }
  4. 使用

    1. 上传jar包到/opt/datas下
      这里写图片描述
    2. 加载JAR包到CLASSPATH下面:add jar /opt/datas/senior-hive-1.0-SNAPSHOT.jar
      这里写图片描述
    3. 创建临时函数:
      这里写图片描述
    4. 使用:select ename,my_lower(ename) xx from emp;
      这里写图片描述
    5. 0.13版本以后创建永久函数

      dfs -put /opt/datas/senior-hive-1.0-SNAPSHOT.jar /user/beifeng/;
      CREATE FUNCTION my_lower2 AS 'om.beifeng.bigdata.LowUDF' USING JAR 'hdfs://hadoop-senior01.ibeifeng.com:8020/user/beifeng/senior-hive-1.0-SNAPSHOT.jar';

      这里写图片描述

    6. show functions;
      这里写图片描述

例:完成去除数据字段中双引号,自定义 UDF

  1. 原始文件
    这里写图片描述
  2. 处理后的结果显示在控制台
    这里写图片描述
  3. 具体代码

    package om.beifeng.bigdata;
    
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.util.Scanner;
    
    import org.apache.commons.lang.StringUtils;
    import org.apache.hadoop.hive.ql.exec.UDF;
    import org.apache.hadoop.io.Text;
    
    public class QuotationUDF extends UDF{
    
        /**
         * 实现去除文本中的双引号
         *
         * @param str
         * @return
         */
        public Text evaluate(Text str){
            // invalidate
            if(null == str){
                return null ;
            }
    
            if(StringUtils.isBlank(str.toString())){
                return null ;
            }
    
            return new Text(str.toString().replaceAll("\"","")) ;
        }
    
        public static void main(String[] args) {
    
            try {
                Scanner in = new Scanner(new File("/opt/datas/Quotation.txt"));
    
                while (in.hasNextLine()) {
                    String str = in.nextLine();
                    System.out.println(new QuotationUDF().evaluate(new Text(str)));
                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
        }
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值