Hive中的UDF、UDTF、UDAF是三种不同类型的用户自定义函数,以下是它们的详细介绍:

UDF(User Defined Function)

  • 定义与特点:对单个输入行进行处理,并生成单个输出行,输入输出关系为1:1。常用于处理数据转换、计算等简单操作,比如字符串处理、日期计算、数据格式化等。
  • 实现方法
    • 继承org.apache.hadoop.hive.ql.exec.UDF类或者org.apache.hadoop.hive.ql.udf.generic.GenericUDF类,建议使用后者,因为GenericUDF提供了更多功能。
    • 对于继承GenericUDF的类,需要重写initializeevaluategetDisplayString等方法;对于继承UDF的类,需要手动提供evaluate方法,且方法名必须为evaluate
  • 使用示例
    • 先将Java代码打包成jar包上传到服务器。
    • 在Hive命令行中添加jar包到Hive Classpath:ADD JAR /home/admin/original-arc-hive-1.0.jar
    • 创建临时函数:CREATE TEMPORARY FUNCTION str_len_1 AS 'com.arc.hive.udf.MyStringLengthFunction'
    • 可在查询中使用:SELECT str_len_1(column_name) FROM table_name

UDAF(User Defined Aggregation Function)

  • 定义与特点:用于对多行数据进行聚合操作,产生一个输出行,输入输出关系为n:1。通常用于计算诸如平均值、总和、计数、最大值、最小值等聚合结果。
  • 实现方法
    • 用户的UDAF必须继承org.apache.hadoop.hive.ql.exec.UDAF,且包含至少一个实现了org.apache.hadoop.hive.ql.exec.UDAFEvaluator的静态类。
    • 实现UDAFEvaluator接口中的inititerateterminatePartialmergeterminate这5个方法。
  • 使用示例
    • 编写Java代码实现自定义的UDAF类。
    • 打包成jar包并添加到Hive的classpath。
    • 创建函数并在查询中使用,如计算平均成绩:SELECT myAVG(score) FROM student_table

UDTF(User Defined Table Generating Function)

  • 定义与特点:对单个输入行进行处理,产生多个输出行,输入输出关系为1:n。常用于将复杂数据结构如数组、Map等展开成多行数据,或者进行数据的拆分、转换等操作。
  • 实现方法
    • 继承org.apache.hadoop.hive.ql.udf.generic.GenericUDTF类。
    • 实现initializeprocessclose三个方法。
  • 使用示例
    • 编写Java代码实现自定义的UDTF类。
    • 打包上传后在Hive命令行创建函数。
    • 使用时一般需要结合lateral view,如SELECT id, names, score FROM udtf_test lateral view split_udtf(name, ',') temp as names