背景
Impala跟Hive一樣节仿,是常用的數(shù)據(jù)倉庫組件之一巢块。熟悉Hive的同學(xué)肯定知道丧裁,Hive官方提供了get_json_object函數(shù)用于處理json字符串护桦,但是Impala官方并沒有提供類似的方法,好在是有第三方實現(xiàn)了一個類似的udf擴(kuò)展煎娇,只需進(jìn)行編譯安裝后二庵,就可以在Impala中處理json字符串了。
環(huán)境介紹
- cdh 5.10.1
- centos 6.8
- impala 2.7.0
步驟
1缓呛、下載安裝第三方軟件
由于Impala是用c++編寫的催享,所以安裝Impala的udf時,需要進(jìn)行編譯哟绊,所以我們需要先下載編譯相關(guān)的第三方軟件因妙,比如gcc等:
# sudo yum install -y gcc-c++ cmake boost-devel
2、安裝Impala UDF SDK
下載rpm票髓,然后進(jìn)行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代碼
第三方實現(xiàn)的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、編譯
進(jìn)入剛才的目錄朽缴,然后編譯:
# cd impala-get-json-object-udf-master
# cmake .
# make
5善玫、上傳擴(kuò)展至hdfs
Impala加載擴(kuò)展時默認(rèn)從hdfs上讀取,所以我們需要將編譯好的udf擴(kuò)展上傳至hdfs上密强。
# hdfs dfs -mkdir /user/udf
# hdfs dfs -put build/libjsonUdf.so /user/udf
6茅郎、使用擴(kuò)展
進(jìn)入impala-shell,創(chuàng)建udf函數(shù)或渤,并且嘗試使用:
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 |
+----------------------------------------------------------------+
可以看到系冗,我們的擴(kuò)展已經(jīng)生效了!
其他
當(dāng)然Impala也支持直接導(dǎo)入Hive中的函數(shù)作為自己的udf薪鹦,但是因為Hive是用java編寫的掌敬,所以性能上沒有c++來得快惯豆。如果可以的話,還是盡量用c++編寫Impala的擴(kuò)展奔害。