hive.optimize.index.filter设置我true,tez查询udf函数报错

hive.optimize.index.filter设置我true,tez查询udf函数报错,第1张

流程错误。

1、新建一个java项目,新建lib项目。

2、将hive集群下面的lib文件夹下面的所有jar(除开php,py)拷贝到lib下面。

3、将jar添加到依赖管理。

4、新建udf类。

5、将项目打成。

6、注意一般工具打包都会给jar延签,使用者有权限验证,所以需要删除权限认证,在linux上面执行。进入hive控制台:addjar/home/hive/jar/udfjar;--你自己的路径。

7、创建临时函数

8、使用函数:selectudftests(20,40)。

9、至此就是一个完整的建立udf的流程,如果要建立永久函数。那么需要将jar放到hdfs或者配置:createfunctionudf_numberAS'comudftestUdfTest'usingjar'hdfs:///hive_jar/udfjar'。

注意这里不要加ip和端口,如果远程创建才需要,本地集群只需要hdfs:///就可以了。

或者hive-envsh配置文件中添加HIVE_AUX_JARS_PATH。

利用 hive 做数据查询或者分析的时候,原生的 hive 函数可能无法满足我们的需求,这时候我们可以自定义 hive udf,函数;

自定义 hive udf 函数,有以下两点要求:

实现 MD5 hive udf 函数注册

函数注册语句:

配置maven的过程网上有很多这里就不写了。

UDF

用户自定义函数(user defined function)–针对单条记录。

创建函数流程

1、自定义一个Java类

2、继承UDF类

3、重写evaluate方法 (必须重写这个方法)

4、打成jar包

6、在hive执行add jar方法

7、在hive执行创建模板函数

8、hql中使用

打包后的文件在你的项目的target当中,上传那个几kb的original-int2inetaddressUDF-10-SNAPSHOTjar那个文件,上传到服务器上随便一个目录

add jar 你的文件路径 /original-int2inetaddressUDF-10-SNAPSHOTjar;

create temporary function myudf as "UDFDemoint2inetaddress";

select myudf(XXX) from xxxx

可以参考这里的视频:

>

package comexamplehiveudf;

import orgapachehadoophiveqlexecUDF;

import orgapachehadoopioText;

public final class LowerCase extends UDF {

public Text evaluate(final Text s) {

if (s == null) { return null; }

return new Text(stoString()toLowerCase());

}

}

2、用eclipse下的fatjar插件进行打包

先下载netsffjepfatjar_0031jar插件包,cp至eclipse/plugins目录下,重启eclipse,右击项目选Export,选择用fatjar导出(可以删掉没用的包,不然导出的jar包很大)

3、将导出的hiveudfjar复制到hdfs上

hadoop fs -copyFromLocal hiveudfjar hiveudfjar

4、进入hive,添加jar,

add jar hdfs://localhost:9000/user/root/hiveudfjar

5、创建一个临时函数

UDTF(User-Defined Table-Generating Functions)是一进多出函数,如hive中的explode()函数。

在学习自定义UDTF函数时,一定要知道hive中的UDTF函数如何使用,不会的先看这篇文章: hive中UDTF函数explode详解 + explode与lateral view 3套案例练习 。

自定义函数、实现UDTF一进多出功能,我们主要关心的是要继承什么类,实现什么方法。

1)继承 orgapachehadoophiveqludfgenericGenericUDTF 类

2)重写 initialize、process、close 方法

继承GenericUDTF抽象类时,我们需要重写 initialize 方法、并实现2个抽象方法 (process、close)

在Alt + Enter回车时,只提示我们实现两个方法抽象方法 process、close 。 initialize方法 不是抽象方法不用实现,但是该方法 需要重写 ,不然会报错。

initialize方法是针对整个任务调一次,initialize作用是 定义输出字段的列名、和输出字段的数据类型 ,重写该方法时里面有一些知识点需要我们记

process方法是 一行数据调用一次process方法 ,即 有多少行数据就会调用多少次process方法 。主要作用是对传入的 每一行数据写出去多次 ,调用forward()将数据写入到一个缓冲区。

有2个点需要记住:

这里没有io流的 *** 作所以不需要关闭。

关于是否有IO流以及是否关闭IO流不清楚。

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

UDF:一进一出

实现方法:

hive> create temporary function function_name as 'comhrjhiveudfUDFClass';

hive> select function_name(tcol1) from table t;

hive> drop temporary function function_name;

UDAF:多进一出

实现方法:

1,用户的UDAF必须继承了orgapachehadoophiveqlexecUDAF;

2,用户的UDAF必须包含至少一个实现了orgapachehadoophiveqlexec的静态类,诸如实现了 UDAFEvaluator

3,一个计算函数必须实现的5个方法的具体含义如下:

init():主要是负责初始化计算函数并且重设其内部状态,一般就是重设其内部字段。一般在静态类中定义一个内部字段来存放最终的结果。

iterate():每一次对一个新值进行聚集计算时候都会调用该方法,计算函数会根据聚集计算结果更新内部状态。当输 入值合法或者正确计算了,则 就返回true。

terminatePartial():Hive需要部分聚集结果的时候会调用该方法,必须要返回一个封装了聚集计算当前状态的对象。

merge():Hive进行合并一个部分聚集和另一个部分聚集的时候会调用该方法。

terminate():Hive最终聚集结果的时候就会调用该方法。计算函数需要把状态作为一个值返回给用户。

4部分聚集结果的数据类型和最终结果的数据类型可以不同。

UDTF:一进多出

实现方法:

2initialize():UDTF首先会调用initialize方法,此方法返回UDTF的返回行的信息(返回个数,类型)

3process:初始化完成后,会调用process方法,真正的处理过程在process函数中,在process中,每一次forward() 调用产生一行;如果产生多列 可以将多个列的值放在一个数组中,然后将该数组传入到forward()函数

4最后close()方法调用,对需要清理的方法进行清理

order by(全局排序):不经常用

sort by+distrbutre by :经常用

set mapreducejobreduce=3;

select from emp sort by empno desc;

select sal,deptno from emp distribute by sal sort by sal;

cluster by:只能是升序排序,相当于(sort by+distrbutre by )

select sal,deptno from emp cluster bY sal;

select concat_ws('_','sdfsdf','sdfs','123');

select cast('000000000000123123123123' as bigint);

select parse_url(' >

以上就是关于hive.optimize.index.filter设置我true,tez查询udf函数报错全部的内容,包括:hive.optimize.index.filter设置我true,tez查询udf函数报错、hive udf 函数:MD5、IDEA下写hive的udf(踩坑教程)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/9651007.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-30
下一篇2023-04-30

发表评论

登录后才能评论

评论列表(0条)

    保存