引言
依然是近期项目需求,impala中需要添加一些Java写的代码,用于SQL操作。
众所周知,Hadoop 是大数据框架,目前对于并发量和数据量大的系统用的还是蛮多的,此文章中所要申明的是,现有语法不足以应对项目需求,需要通过自定义方法来支撑业务需求,比如,我们的大数据平台中,数据为JSON,自带的语句中无法取到其中的键对应的值,或是说,数据仓库中的数据需要进行加密,这时候需要自定义的方法了。
准备
- Java
- Maven
- impala-shell
- shell
ℹ️尽可能的使用相同的版本进行编译
编码
导入Maven依赖
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>1.1.0</version>
</dependency>
⚠️ 注意:如果引用第三方依赖,需要把第三方依赖一同打包,因此需要使用如下maven插件。
<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>
业务
此时以倒序返回文本为例
- 定义一个类
- 继承
org.apache.hadoop.hive.ql.exec.UDF - 主入口名叫
evaluate
例如:
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打包就不必多说了,附上一张截图吧。

通过rz 或者 ftp把jar文件上传到服务器上
此时,加入我们的文件上传到了服务器的`/tmp' 路径下了,文件名为Demo.jar,通过hdfs命令,把jar文件上传到文件系统中,当然,目录也是我们自己定义的。
hdfs dfs -put Demo.jar /user/impala/user_function/
可以通过hdfs dfs -ls /user/impala/user_function/命令来查看是否上传成功,如果没有这个目录可以进行手动创建,再次不进行演示说明了。
创建方法
通过以上的步骤,我们已经把jar文件导入到了hdfs中,接下来通过impala-shell创建方法,使用如下语句
create function reverse(String) returns String location 'hdfs:///user/impala/user_function/Demo.jar' symbol='Demo';
解释一下上面的语句,创建方法 reverse是方法名,括号中的是传入参数的类型,如果含有多个参数,可以这样写(String, String) returns 后面的是返回的数据类型,location为jar文件的路径,symbol为创建的类的类名。 在这里,我们能猜到,impala实际上应该使用的是反射执行的方法。
测试
select reverse("123456");
+--------+
| reverse |
+--------+
| 654321 |
+--------+
遇到的坑
- 当修改jar文件后,重新上传,需要重新创建方法。
- NoClassDefFoundError,打包jar文件时,没有pom中引入的其它以来给一同打包进来,解决方法见开头。
用到的语句
show create function [function_name]; -- 显示创建方法的语句
show functions; -- 显示已经存在的方法
drop function [function_name](arg_type); 删除方法,注意后面是方法名和参数类型

评论 0
还没有评论,来说点什么吧。