「java调用udtf」JAVA调用dll

博主:adminadmin 2023-01-02 03:12:10 842

本篇文章给大家谈谈java调用udtf,以及JAVA调用dll对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

看懂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流不清楚。

最后文章里面,还有很多描述不清楚的地方,以及我不明白的地方,大家也可以去看看其他的文章。

将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的信息别忘了在本站进行查找喔。