【Hive六】Hive用户自定义函数(UDF)

编程技术  /  houtizong 发布于 3年前   81

1. 什么是Hive UDF

Hive是基于Hadoop中的MapReduce,提供HQL查询的数据仓库。Hive是一个很开放的系统,很多内容都支持用户定制,包括:

  • 文件格式:Text File,Sequence File
  • 内存中的数据格式: Java Integer/String, Hadoop IntWritable/Text
  • 用户提供的 map/reduce 脚本:不管什么语言,利用 stdin/stdout 传输数据
  • 用户自定义函数: Substr, Trim
  • 用户自定义聚合函数: Sum, Average
  • UDF只能实现一进一出的操作,如果需要实现多进一出,则需要实现UDAF

2. UDF用法

  • UDF函数可以直接应用于select语句,对查询结构做格式化处理后,再输出内容
  • 自定义UDF需要继承org.apache.hadoop.hive.ql.UDF
  • 自定义的UDF需要实现UDF的evaluate方法
  • UDF的evaluate方法支持重载,即可以定义多个evaluate方法,这个方法参数列表与用户调用UDF函数时提供的方法参数一致即可

3.自定义函数UDF实现举例

 

 

package org.apache.hadoop.hive.ql.udf;import org.apache.hadoop.hive.ql.exec.UDF;import org.apache.hadoop.hive.serde2.io.DoubleWritable;import org.apache.hadoop.hive.serde2.io.HiveDecimalWritable;public abstract class UDFMath extends UDF {  private final DoubleWritable doubleWritable = new DoubleWritable();  public UDFMath() {  }  /**   * For subclass to implement.   */  public abstract DoubleWritable evaluate(DoubleWritable a);  /**   * Convert HiveDecimal to a double and call evaluate() on it.   */  public final DoubleWritable evaluate(HiveDecimalWritable writable) {    if (writable == null) {      return null;    }    double d = writable.getHiveDecimal().bigDecimalValue().doubleValue();    doubleWritable.set(d);    return evaluate(doubleWritable);  }}

 

 

 

package org.apache.hadoop.hive.ql.udf;import org.apache.hadoop.hive.ql.exec.Description;import org.apache.hadoop.hive.ql.exec.UDF;import org.apache.hadoop.hive.ql.exec.vector.VectorizedExpressions;import org.apache.hadoop.hive.ql.exec.vector.expressions.gen.FuncSinDoubleToDouble;import org.apache.hadoop.hive.ql.exec.vector.expressions.gen.FuncSinLongToDouble;import org.apache.hadoop.hive.serde2.io.DoubleWritable;import org.apache.hadoop.hive.serde2.io.HiveDecimalWritable;/** * UDFSin. * */@Description(name = "sin",    value = "_FUNC_(x) - returns the sine of x (x is in radians)",    extended = "Example:\n "    + "  > SELECT _FUNC_(0) FROM src LIMIT 1;\n" + "  0")@VectorizedExpressions({FuncSinLongToDouble.class, FuncSinDoubleToDouble.class})public class UDFSin extends UDFMath {  private final DoubleWritable result = new DoubleWritable();  public UDFSin() {  }  /**   * Take Sine of a.   */  public DoubleWritable evaluate(DoubleWritable a) {    if (a == null) {      return null;    } else {      result.set(Math.sin(a.get()));      return result;    }  }}

 上面是自定义了一个求正玄的UDF函数

 

4. 如何使用自定义函数UDF

  • 把程序打包放到目标机器上去,进入hive客户端,添加jar包
hive>add  jar /user/hadoop/udf.math.sin.jar;

 

  • 创建临时函数:
hive>CREATE TEMPORARY FUNCTION math.sin AS 'org.apache.hadoop.hive.ql.udf.UDFSin';

 

  • 查询临时函数
SELECT math.sin(3.14) FROM word;

 

  •   销毁临时函数:
hive> DROP TEMPORARY FUNCTION math.sin;

 

5.  永久注册UDF到Hive

  • 找到以下文件: ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java
  • 添加新的注册函数myfunc
org.apache.hadoop.hive.ql.udf.UDFMathorg.apache.hadoop.hive.ql.udf.UDFSin

 

添加注册函数的语句

 

registerFunction("udf_math_sina", UDFSin.class)

 

 

 

 

 

 

 

 

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!

留言需要登陆哦

技术博客集 - 网站简介:
前后端技术:
后端基于Hyperf2.1框架开发,前端使用Bootstrap可视化布局系统生成

网站主要作用:
1.编程技术分享及讨论交流,内置聊天系统;
2.测试交流框架问题,比如:Hyperf、Laravel、TP、beego;
3.本站数据是基于大数据采集等爬虫技术为基础助力分享知识,如有侵权请发邮件到站长邮箱,站长会尽快处理;
4.站长邮箱:[email protected];

      订阅博客周刊 去订阅

文章归档

文章标签

友情链接

Auther ·HouTiZong
侯体宗的博客
© 2020 zongscan.com
版权所有ICP证 : 粤ICP备20027696号
PHP交流群 也可以扫右边的二维码
侯体宗的博客