Hive 内置函数&自定义UDF函数

Build-in 内置函数

官网 https://cwiki.apache.org/confluence/display/Hive/Home DML/Operators and UDFs

  • 一些常用内置UDF、UDAF函数
    https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF

  • UDTF函数,行列转换
    collect_list:配合group by 将多行数据收集为一个数组
    concat_ws 将多个拼接为一个
    split 将一个拆分成多个
    explode 栅列 函数

      # name	# course
      PK      MapReduce,Hive,Spark,Flink
      J       Hadoop,HBase,Kafka
      
      // 将以上数据,处理为:
      PK   MapReduce
      PK   Hive
      PK   Spark
      PK   Flink
      J   Hadoop
      J	  HBase
      J	  Kafka
    

使用 explode + split,将course列拆分后转成多行

	select  name, c
	from teacher_course
	lateral view
	explode(split(course,',')) tmp as c;

自定义函数

  • UDF 一进一出。 如:upper lower substr
  • UDAF 多进一出 。 如:sum …
  • UDTF 一进多出。 如:explode
准备函数体并打jar包
  • 创建maven工程导入依赖:
      <dependency>
           <groupId>org.apache.hivegroupId>
           <artifactId>hive-execartifactId>
           <version>3.1.2version>
      dependency>
  • 创建 自定义UDF类继承自 UDF
// 自定义一个 add_random()函数,在传入的参数后增加一个随机整数
public class AddRandomUDF extends org.apache.hadoop.hive.ql.exec.UDF {
    static Random random = new Random();
    // 方法名必须是evaluate,打包后hive会设别和执行
    public String evaluate(String str){
        if (str == null){
            return null;
        }
        
        str += random.nextInt(10);
        return str;
    }
}
  • maven package 打jar包到当前工程target下,上传此jar包至linux

      ~/lib/hive_demo-1.0-SNAPSHOT.jar
    
在hive中创建函数
方式一:临时函数 add jar

启动hive,并add jar

[liqiang@Gargantua bin]$ hive
hive > add jar /home/liqiang/lib/hive_demo-1.0-SNAPSHOT.jar;

创建临时函数:【作用当前会话】

hive > CREATE TEMPORARY FUNCTION add_random AS "com.gargantua.udf.AddRandomUDF";

现在可以在当前会话中同使用内置函数一样使用 add_random()

hive > select add_random('123') from my_table;

此方式需要在使用前 add jar 并 CREATE FUNCTION。可以将这两步命令写在文件中,启动hive同时指定初始化这个文件

[liqiang@Gargantua bin]$ hive -i [这个文件]
方式二:临时函数 auxlib/xxx.jar
  • ${HIVE_HOME}/auxlib目录下的jar会自动被hive关联,于是可以省掉 add jar这一步。
    创建 auxlib 目录,并复制一份jar到 auxlib/

  • 启动hive,并创建函数 【作用当前会话】

      hive > CREATE TEMPORARY FUNCTION add_random AS "com.gargantua.udf.AddRandomUDF";
    
方式三:持久函数
参考:
	CREATE FUNCTION [db_name.]function_name AS class_name  [USING JAR|FILE|ARCHIVE 'file_uri' [, JAR|FILE|ARCHIVE 'file_uri'] ];
  • jar 包不能存在本地了。需要上传hdfs。

      [liqiang@Gargantua data]$ hdfs dfs -put ~/lib/hive_demo-1.0-SNAPSHOT.jar  /lib/
    
  • 创建持久函数。 【作用所有会话】

      hive > CREATE FUNCTION  add_random AS "com.gargantua.udf.AddRandomUDF" 
      	   > USING JAR "hdfs://gargantua:9000/lib/hive_demo-1.0-SNAPSHOT.jar";
    
方式四:IDEA导入Hive源码编译并创建UDF

参考下一篇:https://blog.csdn.net/qq_45494908/article/details/122379634

你可能感兴趣的:(Hive,hive,hadoop,big,data)