Jaql(a query language desired for JSON:JSON用に位置づけられたクエリ言語)は、JSON型式のデータを処理するためのクエリ言語です。以前の記事では、Jaqlの概要と使い方の基礎を紹介しました。今回は、Jaqlで使われる関数を追加し、記述の簡素化や再利用といったより高度な処理を実現する方法を説明します。
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);
この記事は参考になりましたか?
- この記事の著者
-
米持 幸寿(ヨネモチ ユキヒサ)
日本アイ・ビー・エム公認 ソフトウェア・エバンジェリスト。alphaWorks、developerWorks、インキュベーション系製品、アセットなどのテクノロジーの推進をしつつ、テクノロジー戦略、エバンジェリストチームをリードしている。講演や執筆も多数。主な著書に「かんたんサーバーサイドJava」(翔泳社)、「Webサービス完全解説」(翔泳社)がある。developerWorks Japan ブログ 「米持幸寿のブログ」
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この記事は参考になりましたか?
この記事をシェア
