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

Hive 内置函数&自定义UDF函数,第1张

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工程导入依赖:
      
           org.apache.hive
           hive-exec
           3.1.2
      
  • 创建 自定义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";
    

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5696442.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存