Jaql関数を追加する
Jaqlは、Hadoopで実行されるMapReduceジョブを短い構文で記述できるスクリプト言語です。こちらに紹介記事『「Jaql」を使ってMapReduceをより簡単に』(CodeZine)があります。
本記事では、Jaqlで使われる関数を追加し、Jaqlの記述をより簡素化したり、再利用したり、より高度な処理をJava(TM)で実現したりする方法について説明します。
Jaql既存関数の一覧
関数の追加を検討するにあたり、既存の機能(演算子、ビルトイン関数)などを調査しておく必要があります。すでにあるものを追加する意味はありません。
Jaql関数
Jaqlで関数を記述して再利用できます。記述形式は以下のようになります。
関数名 = fn(引数リスト)(ロジック)
次の例では、引数aとbを受け取り、値を足し算して返します。
myNewFn = fn(a, b) ( a + b ); myNewFn(1,2);
実行すると、以下のようになります。
3
Jaql関数のモジュール化
Jaql関数は、Jaqlスクリプトの前部に書いておけば動作しますが、一度書いたものを何度も書き直さずに再利用したいものです。そこで、分離したスクリプトファイルに書きこんで再利用するのが「モジュール」です。モジュールには、変数定義が書けるため、リテラルデータや、関数を書いておくことができます。
モジュールは、拡張子「.jaql」で終わるファイルとして、保存し、実行時に読み込みます。たとえば、先ほどの「myNewFn」の定義をmodule1.jaqlに書いておきます。
モジュールが置いてある場所は、jaqlshellを起動するときの「jp」パラメーターで指定する必要があります。たとえば、/home/idcuser/mymodulesにモジュールを置き、/home/idcuserでjaqlshellを起動するとしたら、以下のように指定します。
jaqlshell -jp mymodules
例えば、起動後のスクリプトの先頭で、以下のようにしてインポートします。
import module1;
同じ例で、/home/idcuser/mymodules/lib1/module2.jaqlのようにサブフォルダーに分類することもできます。このとき、サブフォルダーにあるファイルは、以下のように、コロン二つ「::」で接続してインポートします。
import lib1::module2;
インポートが済んだら、モジュール名::関数名で呼び出しが可能となります。
module1::myNewFn(1,2);
モジュール名を書くのが面倒であれば、モジュール名にカッコ( )をつけて関数名を指定してインポートすると、モジュール名を省略して利用できます。
import module1(myNewFn); myNewFn(1,2);
(*)と記述することで、同じファイルに定義されているすべての関数を読み込むこともできます。
import module1(*); myNewFn(1,2);