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.hive</groupId>
           <artifactId>hive-exec</artifactId>
           <version>3.1.2</version>
      </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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用自定义UDF函数的方式实现Hive中的CAST函数,需要按照以下步骤进行操作: 1. 创建一个自定义UDF函数类,该类需要继承Hive中的GenericUDF或者AbstractGenericUDF类。具体而言,如果你需要处理单个参数,则可以继承GenericUDF类,如果需要处理多个参数,则可以继承AbstractGenericUDF类。 2. 在类中实现evaluate()方法,该方法用于实现CAST函数的逻辑。该方法需要接收参数,并返回转换后的值。在方法中,你需要编写实现将传入参数转换成指定类型的代码。具体而言,你可以使用Java中的类型转换操作或者其他相关的转换函数来完成这个过程。 3. 将该类编译打包成jar文件,并上传到Hive的classpath中。 4. 在Hive中注册该自定义UDF函数。具体而言,你需要使用CREATE FUNCTION语句来创建该函数,并指定函数的名称、参数类型、返回类型等信息。例如,以下是一个示例代码: ``` CREATE FUNCTION my_cast AS &#39;com.example.MyCastUDF&#39; USING JAR &#39;path/to/my-cast-udf.jar&#39;; ``` 5. 在Hive中使用该自定义UDF函数。具体而言,你需要在SELECT语句中调用该函数,并将需要转换的参数作为函数的参数传入。例如,以下是一个示例代码: ``` SELECT my_cast(column_name AS target_type) FROM table_name; ``` 注意,这里的column_name是需要转换的列名,target_type是需要转换成的目标类型。你需要根据具体的情况进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值