2020.9.22课堂笔记(hiveUDF自定义函数及错误处理)

自定义一个Hive UDF函数,功能是计算两个日期相差的天数。

第一步,创建maven工程,添加依赖的jar包

    <!-- https://mvnrepository.com/artifact/org.apache.hive/hive-exec -->
    <dependency>
      <groupId>org.apache.hive</groupId>
      <artifactId>hive-exec</artifactId>
      <version>1.1.0</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.apache.hive/hive-jdbc -->
    <dependency>
      <groupId>org.apache.hive</groupId>
      <artifactId>hive-jdbc</artifactId>
      <version>1.1.0</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common -->
    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-common</artifactId>
      <version>2.6.0</version>
    </dependency>

第二步,新建java类

该类一定要继承org.apache.hadoop.hive.ql.exec.UDF类(extends UDF)。

第三步,实现evaluate函数

在继承了UDF类中实现evaluate函数,函数名必须是evaluate,可以重载多个evaluate方法。

package cn.kgc.kb09.udf;

import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @Author: ChaoKeAiMuZhi
 * @Date: 2020/9/22 14:44
 * @Description:
 **/
public class HourDiff extends UDF {
    public IntWritable evaluate(Text date1,Text date2) throws Exception{
        String d1 = date1.toString();
        String d2 = date2.toString();
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date dt1 = sdf.parse(d1);
        Date dt2 = sdf.parse(d2);
        long diff = dt1.getTime() - dt2.getTime();
        int rst = (int) (diff / 1000 / 60 / 60);
        return new IntWritable(rst);
    }

/*    public static void main(String[] args) throws Exception{
        HourDiff hd = new HourDiff();
        System.out.println(hd.evaluate(new Text("2020-09-21 12:00:00"),
                new Text("2020-09-22 23:00:00")));
    }*/
}

第四步:打成jar包

如果没有main方法则不选择main方法。

第五步:上传jar包到Linux系统

第六步:从Linux系统上传到hdfs目录

hdfs dfs -mkdir -p /jarstore
hdfs dfs -put /root/testudf.jar /jarstore

第七步:add jar

add jar hdfs://hadoop100:9000/jarstore/testudf.jar;

第八步:create temporary function

create temporary function jar_test as "cn.kgc.kb09.udf.Homework";

第九步:运行方法

select jar_test("2020-09-21 10:00:00","2020-09-22 09:00:00");
hive> add jar /jarstore/testudf.jar;`

错误提示:
jarstore/testudf.jar does not exist
Query returned non-zero code: 1, cause: jarstore/testudf.jar does not exist
更正:

add jar hdfs://hadoop100:9000/jarstore/testudf.jar;

问题描述
使用Hive处理数据的时候,写了一个UDF,然后上传到服务器,添加到Hive中之后,一直报如下的错误:

create temporary function jar_test as "cn.kgc.kb09.udf.Homework";

FAILED: SemanticException [Error 10014]: Line 1:7 Wrong arguments '2': No matching method for class cn.kgc.kb09.udf.Homework with (int, int). Possible choices:

看了方法名称,感觉没错,可是后来,认真的对比了之后,发现方法名称写错了,正确的方法名称:evaluate()

解决方法:
将方法名称修改完成,然后删除Hive中已经注册的方法,退出Hive Shell界面,重新进入Hive Shell,再进行UDF注册的步骤。即可解决!有时候不退出的话,会一直报错,不会进行jar包更新。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值