UDF
概念:
User Defined Function 用户自定义函数
是一个例程,它接受参数、执行操作并返回该操作的结果。根据定义,结果可以是标量值(单个)或表。
UDF 的类型:
UDF 主要有 3 种类型(SQL Server Management Studio 把内联表值函数与多语句表值函数放到了一个组中):
UDF:自定义标准函数
UDAF:自定义聚合函数
UDTF:自定义表生成函数
UDF开发步骤![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/b1eca7d27b4290c99a560e03591333f7.png)
继承UDF类或GenericUDF类
重写evaluate()方法并实现函数逻辑
public class MyFunc extends UDF {
public Text evaluate(ArrayList<Text> txt) {
int male = 0;
int female = 0;
for (Text tx : txt) {
String sex = tx.toString();
if (sex.equalsIgnoreCase("male")) {
male++;
} else {
female++;
}
}
return new Text("male:"+male + ",female:"+female);
}
}
编译打包为jar文件
复制到正确的HDFS路径
在hdfs里面创建文件夹func
hdfs dfs -mkdir /func/
hdfs dfs -put /opt/myfun.jar /func
add jar hdfs://192.168.56.100:9000/func/myfunc.jar
使用jar创建临时/永久函数
create function mytest as "com.njbdqn.MyFunc"
create function mytest as "com.njbdqn.MyFunc" using jar 'hdfs:/func/myfunc.jar'
调用函数
UDTF
一列拆多列,一行拆多行,一列一行拆多列多行
一列拆多列
create table myusers(
> username string,
> hobby string
> )
> stored as textfile;
insert into myusers values('zs','eat,sleep'),('ls','play,film');
add jar /opt/myfun.jar;
create temporary function myudtf as "com.njbdqn.MyUdtfFunc";
select myudtf(hobby) from myusers;
select split(hobby,',') from myusers;
一行拆多行
exit;
use mydemo;
add jar /opt/myfun.jar;
create temporary function myud as "com.njbdqn.MyUdtfFunc";
select myud(hobby) from myusers;
侧视图:只能有一列 一行拆多行
select explode(split(hobby,',')) from myusers;
侧视图放lk列
select username ,lk from myusers lateral view explode(split(hobby,',')) a as lk;
select username ,lk from myusers lateral view myud(hobby) a as lk;