背景
Impala跟Hive一样,是常用的数据仓库组件之一。熟悉Hive的同学肯定知道,Hive官方提供了get_json_object函数用于处理json字符串,但是Impala官方并没有提供类似的方法,好在是有第三方实现了一个类似的udf扩展,只需进行编译安装后,就可以在Impala中处理json字符串了。
环境介绍
- cdh 5.10.1
- centos 6.8
- impala 2.7.0
步骤
1、下载安装第三方软件
由于Impala是用c++编写的,所以安装Impala的udf时,需要进行编译,所以我们需要先下载编译相关的第三方软件,比如gcc等:
# sudo yum install -y gcc-c++ cmake boost-devel
2、安装Impala UDF SDK
下载rpm,然后进行install。这里我们一定要注意,我们不能安装最新版的SDK,因为最新版的SDK还有bug,所以我们需要下载老版的SDK,具体讨论请见这里:
# 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压缩包。下载好了之后解压:
# wget https://codeload.github.com/nazgul33/impala-get-json-object-udf/zip/master
# unzip impala-get-json-object-udf-master.zip
4、编译
进入刚才的目录,然后编译:
# cd impala-get-json-object-udf-master
# cmake .
# make
5、上传扩展至hdfs
Impala加载扩展时默认从hdfs上读取,所以我们需要将编译好的udf扩展上传至hdfs上。
# hdfs dfs -mkdir /user/udf
# hdfs dfs -put build/libjsonUdf.so /user/udf
6、使用扩展
进入impala-shell,创建udf函数,并且尝试使用:
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的扩展。