Cloudera Impala 1.2リリース!
Cloudera 5 (CDH5, Cloudera Manager 5)のアナウンスの陰に隠れて、Cloudera Impala 1.2が公開されています。このリリースで、ついに「ユーザー定義関数(UDF)、ユーザー定義集約関数(UDAF)に対応!(祝)」しました!
早速試してみようと、Mavenをインストールし、Hive0.11用のUDFをビルドするまではうまくいったんですが、なぜかHiveでUDFを実行するのがうまくいかず、試行錯誤の末断念。諦めて既存のHive UDFのjarファイルにある定義関数を試すことにしました。以下手順です。(基本的にはドキュメントに沿って試しただけです)
なお、ImpalaはC++ネイティブのUDFを書くこともできるので、よりパフォーマンスの向上が期待ができますね。
HiveのUDFをImpalaで試す
1) UDFが入っているJarファイルをHDFSにコピーします。
[kawasaki@localhost ~]$ hadoop fs -put /usr/lib/hive/lib/hive-exec.jar /tmp/hive/hiveudf.jar
2) impala-shellを実行し、テスト用のデータベースを作成してから切り替え、関数を定義します。この関数は小文字に変換するだけの関数です。UDFLowerは(*2)を参照。
[localhost:21000] > create database udfs;
Query: create database udfs
Returned 0 row(s) in 3.92s
[localhost:21000] > use udfs;
Query: use udfs
[localhost:21000] > create function my_lower(string) returns string location '/tmp/hive/hiveudf.jar' symbol='org.apache.hadoop.hive.ql.udf.UDFLower';
Query: create function my_lower(string) returns string location '/tmp/hive/hiveudf.jar' symbol='org.apache.hadoop.hive.ql.udf.UDFLower'
Returned 0 row(s) in 1.48s
3) クエリを実行します
[localhost:21000] > select my_lower('Some String NOT ALREADY LOWERCASE');
Query: select my_lower('Some String NOT ALREADY LOWERCASE')
+----------------------------------------------------+
| udfs.my_lower('some string not already lowercase') |
+----------------------------------------------------+
| some string not already lowercase |
+----------------------------------------------------+
Returned 1 row(s) in 0.65s
[localhost:21000] >
うまく動作しました 🙂
4) 文字の長さを数えてみます。
[localhost:21000] > create function my_length(string) returns int location '/tmp/hive/hiveudf.jar' symbol='org.apache.hadoop.hive.ql.udf.UDFLength';
Query: create function my_length(string) returns int location '/tmp/hive/hiveudf.jar' symbol='org.apache.hadoop.hive.ql.udf.UDFLength'
Returned 0 row(s) in 1.45s
[localhost:21000] > select my_length('abcdefg');
Query: select my_length('abcdefg')
+---------------------------+
| udfs.my_length('abcdefg') |
+---------------------------+
| 7 |
+---------------------------+
Returned 1 row(s) in 0.10s
[localhost:21000] >
まとめ
HiveでUDFを定義する場合、例えば ADD JAR でライブラリをロード(またはHIVE_AUX_JARS_PATHに指定)してCREATE FUNCTIONを実行しますが、Impalaの場合は若干異なるようです。
詳細はImpalaのドキュメント(*1)をご覧下さい。
(*1) User-Defined Functions for Impala
(*2) UDFLower()
コメント
(2013/10/31 22:37更新)UDFLengthを追加