impala 添加Java自定义方法

引言

依然是近期项目需求,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>

业务

此时以倒序返回文本为例

  1. 定义一个类
  2. 继承org.apache.hadoop.hive.ql.exec.UDF
  3. 主入口名叫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打包就不必多说了,附上一张截图吧。
image.png

通过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

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

提交后需要审核才会公开。