「java调用udtf」JAVA调用dll
本篇文章给大家谈谈java调用udtf,以及JAVA调用dll对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、看懂UDTF写法
- 2、hive udtf 全局变量在集群中有效吗
- 3、查询hive中有哪些自定义函数
- 4、hive自定义UDTF函数,步骤讲解
- 5、Flink 自定义UDTF函数 同步数组类型到ES中
- 6、关于在Hive中将特定字符分隔的字符串拆分成多行的应用
看懂UDTF写法
UDTF函数,表生成函数,他可以把一行打成多行多列,也可以打成一行多列,一列多行。
比起UDAF,UDTF更好理解一些。
大致分为三个过程:initialize() -- process() -- close()
initialize(): 会校验用户输入,并定义输出的列
process(): 将数据打散的过程,其中会调用forward(),每调用一次,就会生成一行
close(): 方法调用完毕时关闭方法
打散的字段应该是a,b;c,d;e,f这样的形式,按照;分为多行,按照,分为多列
一步一步拆解
一方面在进行用户输入内容的校验,
另外这里还在定义拆解后的列的名称、类型
实现数据打散的逻辑,可以根据需求进行多次循环,也可以不做循环。
多次循环就会生成多行
不做循环就只打散成为多列
在这个process()里,a,b;c,d会先打成两行
a,b
c,d
然后,再逗号分割,打散成两列
a b
c d
forward()会返回每一行结果
hive udtf 全局变量在集群中有效吗
承org.apache.hadoop.hive.ql.udf.generic.GenericUDTF。
实现initialize, process, close三个方法
UDTF首先会调用initialize方法,此方法返回UDTF的返回行的信息(返回个数,类型)。初始化完成后,会调用process方法,对传入的参数进行处理,可以通过forword()方法把结果返回。最后close()方法调用,对需要清理的方法进行清理。
下面是我写的一个
查询hive中有哪些自定义函数
如何在HIVE中使用自己定义的函数,可以有几种方式:
1.在HIVE会话中add 自定义函数的jar文件,然后创建function,继而使用函数
2.在进入HIVE会话之前先自动执行创建function,不用用户手工创建
3.把自定义的函数写到系统函数中,使之成为HIVE的一个默认函数,这样就不需要create temporary function
--------------------------------------------------------------------------------
1.在HIVE会话中add 自定义函数的jar文件,然后创建function,继而使用函数
hive ADD JAR /home/hugh.wangp/UDFMd5.jar;
Added /home/hugh.wangp/UDFMd5.jar to class path
hive CREATE TEMPORARY FUNCTION udfmd5 AS 'udf.UDFMd5';
OK
Time taken: 0.014 seconds
hive select udfmd5('a') from dual;
OK
0cc175b9c0f1b6a831c399e269772661
这种方式的弊端是:每次打开新的会话,就要重新执行一遍如上的add jar和create temporary function的命令。对普通的业务分析人员未免要求太高。第二种方法可以把业务人员释放出来
--------------------------------------------------------------------------------
2.在进入HIVE会话之前先自动执行创建function
HIVE命令有个参数-i:在进入会话,待用户输入自己的HQL之前,先执行-i的参数。我们只需要把add jar和create temporary function的命令写到一个文件中,并把这个文件传到-i的参数,如此一来省去了每次要手工创建的工作。
但是这种方式也有个弊端,当我增添HIVE的gateway,就要拷贝一份这个文件,有时候遗漏真是不可避免的。第三种方法应该就是一个终极方案,只要HIVE本身代码不做修改,或者不删除特定的功能,这个函数就能一直用,而且可以把他作为HIVE的默认函数那样使用
--------------------------------------------------------------------------------
3.把自定义的函数写到系统函数中,使之成为HIVE的一个默认函数
a.编写自己的UDF/UDAF/UDTF,并把代码放到$HIVE_HOME/src/ql/src/java/org/apache/Hadoop/hive/ql/udf/路径下
b.修改$HIVE_HOME/src/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java
以HIVE自带函数Trim()举例,自定义函数操作一样。
第一步:
写UDF代码UDFTrim.java并放到$HIVE_HOME/src/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFTrim.java
第二步:
修改$HIVE_HOME/src/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java文件
a.import org.apache.hadoop.hive.ql.udf.UDFTrim;
b.registerUDF("trim", UDFTrim.class, false);
虽然这种方法是一劳永逸的方法,但是一旦错了,对整个HIVE使用都是灾难性的,所以不是特别通用的自定义函数还是采用前两种,一旦通用的自定义函数累计到一定程度,再去采用第三种方法。
更多相关内容可参考
hive自定义UDTF函数,步骤讲解
UDTF(User-Defined Table-Generating Functions)是一进多出函数,如hive中的explode()函数。
在学习自定义UDTF函数时,一定要知道hive中的UDTF函数如何使用,不会的先看这篇文章: hive中UDTF函数explode详解 + explode与lateral view 3套案例练习 。
自定义函数、实现UDTF一进多出功能,我们主要关心的是要继承什么类,实现什么方法。
1)继承 org.apache.hadoop.hive.ql.udf.generic.GenericUDTF 类
2)重写 initialize、process、close 方法
继承GenericUDTF抽象类时,我们需要重写 initialize 方法、并实现2个抽象方法 (process、close) .
在Alt + Enter回车时,只提示我们实现两个方法抽象方法 process、close 。 initialize方法 不是抽象方法不用实现,但是该方法 需要重写 ,不然会报错。
initialize方法是针对整个任务调一次,initialize作用是 定义输出字段的列名、和输出字段的数据类型 ,重写该方法时里面有一些知识点需要我们记
process方法是 一行数据调用一次process方法 ,即 有多少行数据就会调用多少次process方法 。主要作用是对传入的 每一行数据写出去多次 ,调用forward()将数据写入到一个缓冲区。
有2个点需要记住:
这里没有io流的操作所以不需要关闭。
关于是否有IO流以及是否关闭IO流不清楚。
最后文章里面,还有很多描述不清楚的地方,以及我不明白的地方,大家也可以去看看其他的文章。
Flink 自定义UDTF函数 同步数组类型到ES中
将Mysql中 test表同步到ES中,并且将tags(逗号分隔的字符串)转化数组同步到ES中的数组。
Mysql中test表结构
数据如下:
ES中数据结构
Flink 中
运行Flink任务脚本如下:
自定义UDTF函数参考阿里云链接,注意需要使用java8
上传jar包后,如果返回如下表明包可以上传。
查看tags的类型
关于在Hive中将特定字符分隔的字符串拆分成多行的应用
Subject :关于在 Hive 中将特定字符分隔的字符串拆分成多行的应用
Keys : lateral view 、 split 、 explode 、 HQL 、 Hive 、数据拆分
1、案例描述
假设:
有问卷p1,p2,p3,每个问卷含有问题q1,q2,q3...,每个问题对应答案a11,a21,a31,问题与答案之间,用':'分隔,每个问题之间以','分隔.例如:q1:a11,q2:a21,q3:a31:a32
问题:
将问题与答案拆分成独立的列,如:
P1 q1 a11
P1 q2 a21
…
解决方案:
使用lateral View结合Explode实现数据拆分。
2、小知识:
lateral view用于和split、explode等UDTF一起使用的,能将一行数据拆分成多行数据,在此基础上可以对拆分的数据进行聚合,lateral view首先为原始表的每行调用UDTF,UDTF会把一行拆分成一行或者多行,lateral view在把结果组合,产生一个支持别名表的虚拟表。
1). Lateral View语法
lateral View: LATERAL VIEW udtf(expression) tableAlias AS columnAlias (',' columnAlias)*
from Clause: FROM baseTable(lateralView)*
2). Lateral View用于UDTF(user-defined table generating functions)中将行转成列,例如explode().
3). 目前Lateral View不支持有上而下的优化。如果使用Where子句,查询可能将不被编译。解决方法见:此时,在查询之前执行et hive.optimize.ppd=false;
3、实现步骤:
2.1 创建测试数据
drop table temp_bigdata.test_p1;
create table temp_bigdata.test_p1 as
select 'p1' as p,'q1:a11,q2:a21,q3:a31:a32' as qa from default.dual union all
select 'p2' as p,'q1:a11,q2:a21:a22,q3:a31:a32' as qa from default.dual union all
select 'p3' as p,'q1:a11,q2:a21,q3:' as qa from default.dual;
2.2 查看数据内容
select * from temp_bigdata.test_p1;
p qa
p3 q1:a11,q2:a21,q3
p2 q1:a11,q2:a21:a22,q3:a31:a32
p1 q1:a11,q2:a21,q3:a31:a32
2.3 测试explode函数
select explode(split(qa,',')) as qa1 from temp_bigdata.test_p1;
q1:a11
q2:a21
q3:
q1:a11
q2:a21:a22
q3:a31:a32
q1:a11
q2:a21
q3:a31:a32
2.4 开始处理,先将问题拆分成独立行
drop table temp_bigdata.test_p1_adid;
create table temp_bigdata.test_p1_adid as
select row_number() over(order by p,adid) rid,p, adid
from temp_bigdata.test_p1 LATERAL VIEW explode(split(qa,',')) adtable AS adid;
select * from temp_bigdata.test_p1_adid;
rid p adid
1 p1 q1:a11
2 p1 q2:a21
3 p1 q3:a31:a32
4 p2 q1:a11
5 p2 q2:a21:a22
6 p2 q3:a31:a32
7 p3 q1:a11
8 p3 q2:a21
9 p3 q3:
2.5 再将每个问题中的问题及答案拆分成多行
create table temp_bigdata.test_p1_adid2 as
select rid,
p,
adid, --拆分后的问题和答案
split(adid,':')[0] as q, --取出问题
adid2 --拆分答案为行
from temp_bigdata.test_p1_adid
LATERAL VIEW explode(split(adid,':')) adttable2 as adid2;
select * from temp_bigdata.test_p1_adid2;
rid p adid q adid2
1 p1 q1:a11 q1 q1
1 p1 q1:a11 q1 a11
2 p1 q2:a21 q2 q2
2 p1 q2:a21 q2 a21
3 p1 q3:a31:a32 q3 q3
3 p1 q3:a31:a32 q3 a31
3 p1 q3:a31:a32 q3 a32
4 p2 q1:a11 q1 q1
4 p2 q1:a11 q1 a11
5 p2 q2:a21:a22 q2 q2
5 p2 q2:a21:a22 q2 a21
5 p2 q2:a21:a22 q2 a22
6 p2 q3:a31:a32 q3 q3
6 p2 q3:a31:a32 q3 a31
6 p2 q3:a31:a32 q3 a32
7 p3 q1:a11 q1 q1
7 p3 q1:a11 q1 a11
8 p3 q2:a21 q2 q2
8 p3 q2:a21 q2 a21
9 p3 q3: q3 q3
9 p3 q3: q3
2.6 取出结果,将多余行过滤,及问题列=拆分后的答案列
select * from temp_bigdata.test_p1_adid2 where qadid2 order by rid,adid;
rid p adid q adid2
1 p1 q1:a11 q1 a11
2 p1 q2:a21 q2 a21
3 p1 q3:a31:a32 q3 a32
3 p1 q3:a31:a32 q3 a31
4 p2 q1:a11 q1 a11
5 p2 q2:a21:a22 q2 a22
5 p2 q2:a21:a22 q2 a21
6 p2 q3:a31:a32 q3 a32
6 p2 q3:a31:a32 q3 a31
7 p3 q1:a11 q1 a11
8 p3 q2:a21 q2 a21
9 p3 q3: q3 Null
OK ,得到了想要的结果,说明成功了,可以看到最后一条记录,也能正确的被处理。
4、总结:
1、写法有点怪,一定不要写错;
2、不要忘记起别名,要不select没列可写。
java调用udtf的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于JAVA调用dll、java调用udtf的信息别忘了在本站进行查找喔。