4. Jaqlの基礎
Jaqlは、1章で説明したような、JSON型式のオブジェクトを操作していく過程を記述するクエリ言語で、「パイプライン・プログラミング」と呼ばれる型式で記述していきます。
パイプライン・プログラミングといえば、UNIXなどのコマンドラインでよく使われる記述方法です。例えば、カレントディレクトリー上のファイルの、「name」という単語が含まれる行をすべて表示するには、以下のようなコマンドを使います。
cat *.* | grep name
UNIXシェルの場合は、縦棒「|」で接続しますが、Jaqlの場合はハイフン「-」と小なり「>」を組み合わせた矢印で繋ぎます。
データソース -> 処理 -> 処理 -> 処理;
1つの処理命令の最後は、セミコロン「;」で終わります(注意:試してみましたが、残念ながら、現在の実装では日本語名の処理名は作れませんでしたので、実際には英文字で表記していきます)。
このように処理命令を並べて、全体の処理を記述していく言語です。処理命令は演算子(operator)や関数(function)を使って書いていきます。
また、処理と処理の間を流れるデータのモデルは、常にJSONのモデルで考えます。
Apache Hadoop MapReduce APIでは、前回解説したように「writable」というデータモデルを採用していますが、JaqlではJSONを採用している点が違う点に気をつけてください。ただし、プレーンテキストファイルやバイナリーファイルなども、外部ライブラリーを利用して読み込む方法があり、入出力はJSONに限定されません。
演算子や関数に入力できる、あるいは出力されるJSONは、その演算子や関数ごとに異なっており、ある程度決まっています。
$変数
「$」一文字、または「$~」で始まる変数にJSON配列が代入され、そのレコードを順次処理する、という考え方で処理を記述します。現在処理しているレコードは「$」一文字に入っている、というのが基本です。変換を行う演算子を通過するとき、新しい$~変数に代入しなおされることがあります。
演算子(オペレーター)
Jaqlでは、基本言語として7つの演算子を定義しています(たったの7つですから簡単ですね)。
オペレーター | 型式 | 意味 | 出力型式 |
filter | $.head-count > 10(といった条件式) | 件数が10件のもののみ抽出する | 入力と同じ(データを抽出するだけ) |
例:filter $.owner == "米持幸寿" 意味:ownerフィールドが「米持幸寿」であるエントリーだけに絞る |
|||
transform | JSON 記述 | その形に整形しなおす | JSON記述どおり |
例:transform { total : $.a + $.b } 意味:元のデータのaとbのフィールドの合計をtotalフィールドとして出力 |
|||
group | by $変数 = XX into JSON記述 | XXで指定した項目でグループ化 | JSON記述どおりで、値の部分が配列になる |
例:group by $c_group = $.category into { $c_group, total : sum($[*].price } 意味:元のデータのcategoryフィールドでグループ化し、グループごとにpriceを合計する |
|||
join | 変数リスト where 条件 into JSON記述 | 2つの配列のデータを、ID等でマッチングして合成する。SQLのJOINのような処理 | JSON記述どおり |
例:join $cust, $purchase where $cust.id == $purchase.custid into { $cust.id, $purchase } 意味:$cust.idと$purchase.custidでマッチングして2つのデータをマージする |
|||
sort by | $.フィールド名 | 指定されたフィールドでソートする | 入力と同じ |
例:sort by $.total 意味:total フィールドでソートする |
|||
expand | [アイテム] | レコード中の配列に入っているデータを、結果オブジェクトや配列に展開 | |
例:expand $.phones 意味:phones配列に入っている値のみを集めた大きな配列を作る |
|||
top | 件数 | 最初のデータを指定された件数抽出する | 入力と同じ |
例:top 10 意味:最初の10件を抽出 |
(原文: http://code.google.com/p/jaql/wiki/LanguageCore)
ビルトイン関数
Jaqlには、関数名(引数)で呼び出すことのできる関数が多数用意されています。数が多いのでここでは割愛します。リンク先を眺めて、どんなものがあるか感じ取ってください。いくつかの関数について、あとで解説があります。
(原文: http://code.google.com/p/jaql/wiki/Builtin_functions)
出力
すべての演算子、関数が、JSONデータを出力します。jaqlshellをプロンプト実行すると、出力結果が同コンソールに表示されます。->で接続して、次のコマンドに入力されます。