hive UDF详解&实例

xiaoxiao2021-02-27  316

UDF可以直接应用于select语句,对查询结果做格式化处理后输出内容 操作作用于单个数据行,且产生了一个数据行作为输出 实现UDF(User-Defined-Function) 需要继承org.apache.hadoop.hive.ql.UDF 需要实现evaluate函数(evaluate函数支持重载)

实例:

实现UDF查找hive表中array类型列的值中是否包含某一项 SELECT FIND_IN_ARRAY(column, ‘key’) FROM users;

数据准备

# cat /root/person.txt zhangsan beijing,shanghai,tianjin,hangzhou lisi changchu,chengdu,wuhan

创建表&导入数据

Create table users(name string, worklocations array<string> ) row format delimited fields terminated by '\t' collection items terminated by ','; load data local inpath '/root/person.txt ' OVERWRITE INTO TABLE users;

hive array基本操作看这里建表+查询+修改

关键代码

public class find_in_array extends UDF{ public ArrayList<String> evaluate(String keywords,ArrayList<String> column){ //参数类型使用arraylist<String>对应hive中的array<string>,而不是String[] if(column.contains(keywords)){ return column; }else{ return null; } } public String evaluate(String keywords,ArrayList<String> column,String name){ //重载evaluate,另一种查询方式,返回name值 if(column.contains(keywords)){ return name; }else{ return null; } } }

编写完成后,导出jar包

UDF使用方法:

方法1 会话结束后,函数会自动销毁,所以每次打开新的会话,都要重新add jar并create temporary function

hive> add jar /root/find_in_array.jar; Added [/root/find_in_array.jar] to class path Added resources: [/root/find_in_array.jar] hive> create temporary function find_in_array as 'com.neu.hive.UDF.find_in_array'; OK Time taken: 0.448 seconds hive> select find_in_array('beijing',worklocations,name)from users; OK zhangsan NULL Time taken: 0.578 seconds, Fetched: 2 row(s) hive> select find_in_array('beijing',worklocations)from users; OK ["beijing","shanghai","tianjin","hangzhou"] NULL Time taken: 0.049 seconds, Fetched: 2 row(s)

方法2 使用hive -i参数在进入hive时自动初始化,会话结束后,函数也会自动销毁

# cat hive_init add jar /root/find_in_array.jar; create temporary function topK as 'com.neu.hive.UDF.find_in_array'; # hive -i hive_init

方法3 将UDF注册为内置函数,如果不是特别通用,固化下来的函数,不要使用这种方法

运行结果

常见错误

报以下错误,一定要有evaluate函数,且参数要匹配,要仔细检查! hive> select find(name,users.worklocations)from users; FAILED: SemanticException [Error 10014]: Line 1:7 Wrong arguments ‘worklocations’: No matching method for class com.neu.hive.UDF.find_in_array with (string, array). Possible choices:

转载请注明原文地址: https://www.6miu.com/read-1552.html

最新回复(0)