Loading... # 引言 依然是近期项目需求,impala中需要添加一些Java写的代码,用于SQL操作。 众所周知,Hadoop 是大数据框架,目前对于并发量和数据量大的系统用的还是蛮多的,此文章中所要申明的是,现有语法不足以应对项目需求,需要通过自定义方法来支撑业务需求,比如,我们的大数据平台中,数据为JSON,自带的语句中无法取到其中的键对应的值,或是说,数据仓库中的数据需要进行加密,这时候需要自定义的方法了。 # 准备 - Java - Maven - impala-shell - shell ℹ️尽可能的使用相同的版本进行编译 # 编码 ## 导入Maven依赖 ```xml <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-exec</artifactId> <version>1.1.0</version> </dependency> ``` ⚠️ 注意:如果引用第三方依赖,需要把第三方依赖一同打包,因此需要使用如下maven插件。 ```xml <plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> <!--指定编译版本,与一同打包关系不大--> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> ``` ## 业务 此时以倒序返回文本为例 1. 定义一个类 2. 继承`org.apache.hadoop.hive.ql.exec.UDF` 3. 主入口名叫`evaluate` 例如: ```java public class Demo extends org.apache.hadoop.hive.ql.exec.UDF { public String evaluate(String content){ StringBuilder sb = new StringBuilder(content); StringBuilder reverse = sb.reverse(); return reverse.toString(); } } ``` 此时入口参数为一个,类型为字符串,返回结果类型也是字符串 # 打包和导入到文件系统 Java项目通过maven打包就不必多说了,附上一张截图吧。 ![image.png](https://www.zunmx.top/usr/uploads/2021/08/2061487051.png) 通过rz 或者 ftp把jar文件上传到服务器上 此时,加入我们的文件上传到了服务器的`/tmp' 路径下了,文件名为Demo.jar,通过hdfs命令,把jar文件上传到文件系统中,当然,目录也是我们自己定义的。 ```bash hdfs dfs -put Demo.jar /user/impala/user_function/ ``` 可以通过`hdfs dfs -ls /user/impala/user_function/`命令来查看是否上传成功,如果没有这个目录可以进行手动创建,再次不进行演示说明了。 # 创建方法 通过以上的步骤,我们已经把jar文件导入到了hdfs中,接下来通过`impala-shell`创建方法,使用如下语句 ```sql create function reverse(String) returns String location 'hdfs:///user/impala/user_function/Demo.jar' symbol='Demo'; ``` 解释一下上面的语句,创建方法 reverse是方法名,括号中的是传入参数的类型,如果含有多个参数,可以这样写`(String, String)` returns 后面的是返回的数据类型,location为jar文件的路径,symbol为创建的类的类名。 在这里,我们能猜到,impala实际上应该使用的是反射执行的方法。 # 测试 ```sql select reverse("123456"); ``` ```bash +--------+ | reverse | +--------+ | 654321 | +--------+ ``` # 遇到的坑 + 当修改jar文件后,重新上传,需要重新创建方法。 + NoClassDefFoundError,打包jar文件时,没有pom中引入的其它以来给一同打包进来,解决方法见开头。 # 用到的语句 ```sql show create function [function_name]; -- 显示创建方法的语句 show functions; -- 显示已经存在的方法 drop function [function_name](arg_type); 删除方法,注意后面是方法名和参数类型 ``` © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏