Impala安装json解析udf插件

背景

Impala跟Hive一样,是常用的数据仓库组件之一。熟悉Hive的同学肯定知道,Hive官方提供了get_json_object函数用于处理json字符串,但是Impala官方并没有提供类似的方法,好在是有第三方实现了一个类似的udf扩展,只需进行编译安装后,就可以在Impala中处理json字符串了。

环境介绍

  1. cdh 5.10.1
  2. centos 6.8
  3. impala 2.7.0

步骤

1、下载安装第三方软件

由于Impala是用c++编写的,所以安装Impala的udf时,需要进行编译,所以我们需要先下载编译相关的第三方软件,比如gcc等:

1
# sudo yum install -y gcc-c++ cmake boost-devel

2、安装Impala UDF SDK

下载rpm,然后进行install。这里我们一定要注意,我们不能安装最新版的SDK,因为最新版的SDK还有bug,所以我们需要下载老版的SDK,具体讨论请见这里

1
2
# wget https://archive.cloudera.com/cdh5/redhat/6/x86_64/cdh/5.10.1/RPMS/x86_64/impala-udf-devel-2.7.0+cdh5.10.1+0-1.cdh5.10.1.p0.8.el6.x86_64.rpm
# rpm -ivh impala-udf-devel-2.7.0+cdh5.10.1+0-1.cdh5.10.1.p0.8.el6.x86_64.rpm

3、下载udf代码

第三方实现的json解析udf代码位于:https://github.com/nazgul33/impala-get-json-object-udf。下载的方式有很多,我们可以clone,或者直接下载zip压缩包。下载好了之后解压:

1
2
# wget https://codeload.github.com/nazgul33/impala-get-json-object-udf/zip/master
# unzip impala-get-json-object-udf-master.zip

4、编译

进入刚才的目录,然后编译:

1
2
3
# cd impala-get-json-object-udf-master
# cmake .
# make

5、上传扩展至hdfs

Impala加载扩展时默认从hdfs上读取,所以我们需要将编译好的udf扩展上传至hdfs上。

1
2
# hdfs dfs -mkdir /user/udf
# hdfs dfs -put build/libjsonUdf.so /user/udf

6、使用扩展

进入impala-shell,创建udf函数,并且尝试使用:

1
2
3
4
5
6
7
8
impala-shell> use test_db;
impala-shell> CREATE FUNCTION json_get_object (string, string) RETURNS string location '/user/udf/libjsonUdf.so' symbol='JsonGetObject';
impala-shell> SELECT json_get_object('{"name":"steven"}', '$.name');
+----------------------------------------------------------------+
| user_activities.json_get_object('{"name":"steven"}', '$.name') |
+----------------------------------------------------------------+
| steven |
+----------------------------------------------------------------+

可以看到,我们的扩展已经生效了!

其他

当然Impala也支持直接导入Hive中的函数作为自己的udf,但是因为Hive是用java编写的,所以性能上没有c++来得快。如果可以的话,还是尽量用c++编写Impala的扩展。

参考文档

  1. 官方手册
坚持原创技术分享,您的支持将鼓励我继续创作!