Hive的内置函数和自定义函数UDF

15 篇文章 8 订阅
10 篇文章 6 订阅

1 Hive的内置函数

  • 在Hive中给我们内置了很多函数官方地址
  • 也可以在启动hive后输入命令查看函数:
SHOW FUNCTIONS;
DESCRIBE FUNCTION <function_name>;
DESCRIBE FUNCTION EXTENDED <function_name>;
  • 查看所有的内置函数
hive> show functions;
  • 查看函数的具体语法
hive> DESCRIBE FUNCTION case;
OK
CASE a WHEN b THEN c [WHEN d THEN e]* [ELSE f] END - When a = b, returns c; when a = d, return e; else return f

hive> DESCRIBE FUNCTION EXTENDED case;

hive> DESCRIBE FUNCTION EXTENDED case;
OK
CASE a WHEN b THEN c [WHEN d THEN e]* [ELSE f] END - When a = b, returns c; when a = d, return e; else return f
Example:
 SELECT
 CASE deptno
   WHEN 1 THEN Engineering
   WHEN 2 THEN Finance
   ELSE admin
 END,
 CASE zone
   WHEN 7 THEN Americas
   ELSE Asia-Pac
 END
 FROM emp_de
tails

2 Hive自定义函数

Hive中的内置函数,比较简单,用到的时候可以在官网进行查询,虽然有很多内置的函数,但是生产上肯定不够那么全面,所有,用户需要自定义函数来满足自身的求
- 自定义函数开发UDF(官方网址):
1. 使用maven创建一个java项目
2. 继承UDF类;
3. 重写evaluate方法。
(作者使用的IDEA进行开发的)

  • 创建一个HelloUdf类继承UDF,并且重写evaluate方法
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;

import java.io.UTFDataFormatException;

public class HelloUdf extends UDF {
 public Text evaluate (final Text t) {
     if (t == null) return null;

     return new Text("Hello:" + t);
 }
   public static void main(String [] args){
       System.out.println(new HelloUdf().evaluate(new Text("hero")));
    }
 }
  • 打jar包这里写图片描述

  • 上传jar包

[hadoop@zhangyu ~]$ rz
rz waiting to receive.
Starting zmodem transfer.  Press Ctrl+C to cancel.
  100%       4 KB    4 KB/s 00:00:01       0 Errors
[hadoop@zhangyu lib]$ ll
total 8
-rw-r--r--. 1 hadoop hadoop 4232 Jan 15  2018 hive-1.0.jar

hive> add jar /home/hadoop/lib/hive-1.0.jar
    > ;
Added [/home/hadoop/lib/hive-1.0.jar] to class path
Added resources: [/home/hadoop/lib/hive-1.0.jar]          

创建自定义函数有两种格式:临时函数,永久函数(0.13版本后):
官方语法

create temporary function my_lower as 'com.example.hive.udf.Lower';
create function my_db.my_lower as 'com.example.hive.udf.Lower';

3 临时自定义函数(只对当前session有效)

hive> create temporary function say_hello as 'cn.zhangyu.HelloUdf';
OK
hive> select ename,say_hello(ename)from emp;
OK
ENAME   Hello:ENAME
SMITH   Hello:SMITH
ALLEN   Hello:ALLEN
WARD    Hello:WARD
JONES   Hello:JONES
MARTIN  Hello:MARTIN
BLAKE   Hello:BLAKE
CLARK   Hello:CLARK
SCOTT   Hello:SCOTT
KING    Hello:KING
TURNER  Hello:TURNER
ADAMS   Hello:ADAMS
JAMES   Hello:JAMES
FORD    Hello:FORD
MILLER  Hello:MILLER
Time taken: 0.119 seconds, Fetched: 15 row(s)
  • 查看jar包
hive> list jar;
/home/hadoop/lib/hive-1.0.jar
  • 查看自定义函数
hive> show functons;

4 永久函数

  • 把jar包上传到hdfs上
[hadoop@zhangyu lib]$ hdfs dfs -put /home/hadoop/lib/hive-1.0.jar /lib
[hadoop@zhangyu lib]$ hdfs dfs -ls /lib
-rw-r--r--   1 hadoop supergroup       4232 2018-01-14 08:03 /lib/hive-1.0.jar
  • 创建永久函数
hive> CREATE FUNCTION say_hello1
    > AS 'cn.zhangyu.HelloUdf'
    > USING JAR 'hdfs:///lib/hive-1.0.jar';
converting to local hdfs:///lib/hive-1.0.jar
Added [/tmp/7f999adc-e8a4-4642-af56-581f078cdc32_resources/hive-1.0.jar] to class path
Added resources: [hdfs:///lib/hive-1.0.jar]
OK
  • 测试
hive> select ename,say_hello1(ename)from emp;
OK
ENAME   Hello:ENAME
SMITH   Hello:SMITH
ALLEN   Hello:ALLEN
WARD    Hello:WARD
JONES   Hello:JONES
MARTIN  Hello:MARTIN
BLAKE   Hello:BLAKE
CLARK   Hello:CLARK
SCOTT   Hello:SCOTT
KING    Hello:KING
TURNER  Hello:TURNER
ADAMS   Hello:ADAMS
JAMES   Hello:JAMES
FORD    Hello:FORD
MILLER  Hello:MILLER
Time taken: 0.084 seconds, Fetched: 15 row(s)

注意:执行这条语句创建永久函数,show functiuons 会加上默认的数据库名在函数名前。(default.say_hello1)

5 在MySQL中查询创建的自定义函数

mysql> select * from funcs;
+---------+---------------------+-------------+-------+------------+-----------+------------+------------+
| FUNC_ID | CLASS_NAME          | CREATE_TIME | DB_ID | FUNC_NAME  | FUNC_TYPE | OWNER_NAME | OWNER_TYPE |
+---------+---------------------+-------------+-------+------------+-----------+------------+------------+
|       1 | cn.zhangyu.HelloUdf |  1515888313 |     1 | say_hello1 |         1 | NULL       | USER       |
+---------+---------------------+-------------+-------+------------+-----------+------------+------------+
1 row in set (0.00 sec)
  • 10
    点赞
  • 72
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
要使用自定义UDF函数的方式实现Hive中的CAST函数,需要按照以下步骤进行操作: 1. 创建一个自定义UDF函数类,该类需要继承Hive中的GenericUDF或者AbstractGenericUDF类。具体而言,如果你需要处理单个参数,则可以继承GenericUDF类,如果需要处理多个参数,则可以继承AbstractGenericUDF类。 2. 在类中实现evaluate()方法,该方法用于实现CAST函数的逻辑。该方法需要接收参数,并返回转换后的值。在方法中,你需要编写实现将传入参数转换成指定类型的代码。具体而言,你可以使用Java中的类型转换操作或者其他相关的转换函数来完成这个过程。 3. 将该类编译打包成jar文件,并上传到Hive的classpath中。 4. 在Hive中注册该自定义UDF函数。具体而言,你需要使用CREATE FUNCTION语句来创建该函数,并指定函数的名称、参数类型、返回类型等信息。例如,以下是一个示例代码: ``` CREATE FUNCTION my_cast AS 'com.example.MyCastUDF' USING JAR 'path/to/my-cast-udf.jar'; ``` 5. 在Hive中使用该自定义UDF函数。具体而言,你需要在SELECT语句中调用该函数,并将需要转换的参数作为函数的参数传入。例如,以下是一个示例代码: ``` SELECT my_cast(column_name AS target_type) FROM table_name; ``` 注意,这里的column_name是需要转换的列名,target_type是需要转换成的目标类型。你需要根据具体的情况进行修改。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值