当前位置: 首页 / 技术干货 / 正文
Hive的UDF函数

2023-02-09

   函数 hive

  在Hive中,系统内置了很多的函数,能够处理很多场景的需求。但是即便提供的函数再丰富,依然不能满足我们所有的需求,有时候对于一些比较复杂的需求,我们就可以自定义函数,来实现自己想要的效果。这就是所谓的UDF函数。

  UDF:User Defined Function。用户自定义函数,接收一行数据,返回一行的结果。而且这也是在Hive开发的时候,最常用的函数之一。

  1使用IDEA,创建Maven项目,并添加pom依赖:

<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>3.1.2</version>
</dependency>

  2设计类,继承GenericUDF类,实现这个类中的抽象方法:

  public class ReverseCaseUDF extends GenericUDF {

  /**

  * 执行我们自己的业务逻辑之前的校验,常用于校验参数的数量、类型是否符合自己的需求

  */

  @Override

  public ObjectInspector initialize(ObjectInspector[] objectInspectors) throws UDFArgumentException {

  return null;

  }

  /**

  * 自己需要执行的逻辑操作

  */

  @Override

  public Object evaluate(DeferredObject[] deferredObjects) throws HiveException {

  return null;

  }

  @Override

  public String getDisplayString(String[] strings) {

  return null;

  }

  }

  案例:自己实现concat_ws函数

  1设计自己的UDF类

  public class StringJoinUDF extends GenericUDF {

  @Override

  public ObjectInspector initialize(ObjectInspector[] objectInspectors) throws UDFArgumentException {

  // 参数数量检查

  if (objectInspectors.length < 3) {

  throw new UDFArgumentException("参数数量不正确!至少需要一个分隔符,两个需要拼接的字符串");

  }

  return PrimitiveObjectInspectorFactory.javaStringObjectInspector;

  }

  @Override

  public Object evaluate(DeferredObject[] deferredObjects) throws HiveException {

  // 1. 获取到分隔符

  String separator = deferredObjects[0].get().toString();

  // 2. 定义一个StringBuilder的字符串,用来拼接最后的结果

  StringBuilder result = new StringBuilder();

  // 3. 遍历数组中的每一个参数,从1开始

  for (int i = 1; i < deferredObjects.length - 1; i++) {

  result.append(deferredObjects[i].get().toString()).append(separator);

  }

  result.append(deferredObjects[deferredObjects.length - 1].get().toString());

  return result.toString();

  }

  @Override

  public String getDisplayString(String[] strings) {

  return null;

  }

  }

  2将项目打包,jar包上传到Linux服务器,并保存到任意路径上。

  3创建自定义函数

# 1. 添加jar包到classpath
add jar ~/udf_1.0.jar

# 2. 创建临时函数
create temporary function my_concat_ws as 'com.qf.hive.udf.FirstUDF';

# 3. 使用测试
select my_concat_ws(', ', 'Java', 'MySQL', 'Hive');

  配置文件加载

  自定义函数已经实现了,但是无论是 add jar ,还是创建的临时函数,都是只针对当前的会话生效的。当我们重启hive客户端的时候,就无法再使用了,需要重新加载、配置一次。这样做太麻烦了,有没有一种方式,可以实现自动的加载呢?

  我们可以通过将上述的操作写入到配置文件中的形式来完成。在 $HIVE_HOME/conf 的目录下,创建一个文件 .hiverc,这个文件会在hive客户端启动的时候,自动的加载。因此我们就可以将上述的 add jar 和 创建临时函数的操作写入到这个文件中即可。

  因此,我们就必须要规划好一个jar包保存的位置。这个位置可以是Linux本地的路径,也可以是HDFS的路径。

  ●Linux本地路径,推荐存放在 $HIVE_HOME/lib 的目录下。

  ●HDFS的路径,可以创建自己的路径,然后将jar包保存起来即可。

分享: 更多

上一篇:Hive的分区表

下一篇:Hive的内部表和外部表

好程序员公众号

  • · 剖析行业发展趋势
  • · 汇聚企业项目源码

好程序员开班动态

More+
  • HTML5大前端 <高端班>

    开班时间:2021-04-12(深圳)

    开班盛况

    开班时间:2021-05-17(北京)

    开班盛况
  • 大数据+人工智能 <高端班>

    开班时间:2021-03-22(杭州)

    开班盛况

    开班时间:2021-04-26(北京)

    开班盛况
  • JavaEE分布式开发 <高端班>

    开班时间:2021-05-10(北京)

    开班盛况

    开班时间:2021-02-22(北京)

    开班盛况
  • Python人工智能+数据分析 <高端班>

    开班时间:2021-07-12(北京)

    预约报名

    开班时间:2020-09-21(上海)

    开班盛况
  • 云计算开发 <高端班>

    开班时间:2021-07-12(北京)

    预约报名

    开班时间:2019-07-22(北京)

    开班盛况
IT培训IT培训
在线咨询
IT培训IT培训
试听
IT培训IT培训
入学教程
IT培训IT培训
立即报名
IT培训

Copyright 2011-2023 北京千锋互联科技有限公司 .All Right 京ICP备12003911号-5 京公网安备 11010802035720号