hive自定义函数udf(临时和永久函数)

hive自定义函数udf

一、UDF(user defined functions)用于处理单行数据,并生成单个数据行

1、自定义UDF 的步骤:

1.1、编写自定义的UDF函数

  • 继承"org.apache.hadoop.hive.ql.exec.UDF"类
  • 至少实现一个evaluate()方法,evaluate函数支持重载

例子:

<dependencies>
       
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-common</artifactId>
            <version>2.7.5</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>2.7.5</version>
        </dependency>
        
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-hdfs</artifactId>
            <version>2.7.5</version>
        </dependency>

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

    </dependencies>
import org.apache.hadoop.hive.ql.exec.UDF;

import java.text.ParseException;
import java.text.SimpleDateFormat;

/**
 * Description: xxx
* Copyright(c),2020,zll
* This program is protected by laws
* Date:2020年#05月27日 * * @author zll * @version:1.0 */
public class DateUtils extends UDF { /** * 将日期字符串格式化为标准的日期格式 * 如: * 2017-8-9 to 2017-08-09 * 2017-08-09 9:23:3 to 2017-08-0909:23:03 * @param sdate * @param pattern * @return */ public static String evaluate(String sdate, String pattern) { String formatDate = sdate; SimpleDateFormat sdf = new SimpleDateFormat(pattern); try { formatDate =sdf.format(sdf.parse(sdate)); } catch (ParseException e) { e.printStackTrace(); } return formatDate; } }

1.2、hive中创建临时函数

1)本地打包上传到服务器
scp /Users/zll/Desktop/dateUtils.jar root@hadoop01:/data/hive/lib
2)创建临时函数:
add jar /data/hive/lib/dateUtils.jar;
CREATE TEMPORARY FUNCTION dateUtils as 'DateUtils';    

'SubstrTimeUDF’代表你在编写自定义函数的类名

3)测试:

数据准备:

1,2019-6-2 11:09:12
2,2019-6-4 11:12:12
3,2019-06-25 11:12:13

建表语句:

create table login_time(
    id int,
    loginTime string
)
row format delimited
fields terminated by ',';

加载数据:

load data local inpath '/root/data/arithmetic/data3' overwrite into table login_time;

检查数据:

hive> select * from login_time;
OK
1	2019-6-2 11:09:12
2	2019-6-4 11:12:12
3	2019-06-25 11:12:13

测试自定义函数:

select dateUtils(loginTime,"yyyy-MM-dd HH:mm:ss") from login_time;

结果:

hive> select dateUtils(loginTime,"yyyy-MM-dd HH:mm:ss") from login_time;
OK
2019-06-02 11:09:12
2019-06-04 11:12:12
2019-06-25 11:12:13
Time taken: 0.067 seconds, Fetched: 3 row(s)

4)其他命令:

查询函数:show functions;
显示UDF函数: show functions like dateUtils;
删除临时函数: drop TEMPORARY function dateUtils;

1.3、创建永久函数

1)本地打包上传到服务器
scp /Users/zll/Desktop/SubstrTimeUDF.jar root@hadoop01:/data/hive/lib
2)在hdfs上创建目录
hadoop fs -mkdir /user/lib/
3)将jar包从服务器上传到hdfs的指定目录,例如/user/lib/目录
hadoop fs -put /data/hive/lib/dateUtils.jar /user/lib/
4)设置文件的可读权限
hadoop fs -chmod a+x /user/lib/dateUtils.jar
5)创建永久自定义函数
create function default.dateUtils as 'DateUtils' 
using jar 'hdfs://hadoop01:9000/user/lib/dateUtils.jar';

测试结果:

hive> select default.dateUtils(loginTime,"yyyy-MM-dd HH:mm:ss") from login_time;
OK
2019-06-02 11:09:12
2019-06-04 11:12:12
2019-06-25 11:12:13
Time taken: 0.086 seconds, Fetched: 3 row(s)

你可能感兴趣的:(大数据-Hive)