hadoop-logo
ようこそ Tech blogへ!
「これからHadoopを勉強しよう」という方はまず下記のページから

サイトの移行に伴って画像が表示されないなどの不具合が生じています

Cloudera Impala 1.2でHiveのUDFを試す

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()

コメント

  1. kernel023 kawasaki より:

    (2013/10/31 22:37更新)UDFLengthを追加