hive 自定义函数

hive自定义函数

  • 自定义函数

    • UDF函数(User-Defined-Function) 一进一出;
      ==》转换大小写

    • UDAF函数(User-Defined Aggregation Function) 多进一出;
      max(),min(),avg()…..

    • UDTF(User-Defined Table-Generation Function) 一进多出;
      解析IP地址

      1
      2
      3
      4
      5
      6
      7
      8
      9
      UDF函数的编写规范:
      1、自定义函数编写的时候必须要继承一个类,UDF
      2、必须实现一个或者多个evalucate方法
      3、该方法必须有返回值
      4、可以返回null
      5、建议使用hadoop的数据类型,Text
      编写自定义函数的准备工作
      安装maven,导入hive的jar包,替换仓库。
  • 案例

    • 确定maven环境已经安装完毕
    • 转换大小写,getLower(必须继承UDF,必须继承一个或者多个evaluate方法,尽量使用hadoop数据类型,必须有返回值)
    • 代码

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      package hdfs;
      import jodd.util.StringUtil;
      import org.apache.hadoop.hive.ql.exec.UDF;
      import org.apache.hadoop.io.Text;
      public class getLower extends UDF{
      public Text evaluate(Text str){
      if(str==null){
      return null;
      }
      if(StringUtil.isBlank(str.toString()))
      return null;
      return new Text(str.toString().toLowerCase());
      }
      public static void main(String[] args){
      System.out.println(new getLower().evaluate(new Text("SADHJKASHDASJD")));
      }
      }
    • 打包上传到linux文件系统

      • 第一种方式:

        hive (mydb)> add jar extJars/Lower.jar;

        hive (mydb)> create temporary function getLower as ‘hdfs.getLower’;

      • 第二种方式:

        把自定义jar上传到文件系统

        1
        2
        3
        4
        5
        6
        7
        create temporary function getLower as 'hdfs.getLower' using jar'hdfs://beifeng.com:8020/input/Lower.jar';
        converting to local hdfs://beifeng.com:8020/input/Lower.jar
        Added /tmp/6093990c-165d-4ad6-927c-cfc3b50212b9_resources/Lower.jar to class path
        Added resource: /tmp/6093990c-165d-4ad6-927c-cfc3b50212b9_resources/Lower.jar
        OK
        Time taken: 0.125 seconds
坚持原创技术分享,您的支持将鼓励我继续创作!