SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

「Jaql」を使ってMapReduceをより簡単に

Jaql(a query language desired for JSON)の使い方

  • X ポスト
  • このエントリーをはてなブックマークに追加

4. Jaqlの基礎

 Jaqlは、1章で説明したような、JSON型式のオブジェクトを操作していく過程を記述するクエリ言語で、「パイプライン・プログラミング」と呼ばれる型式で記述していきます。

 パイプライン・プログラミングといえば、UNIXなどのコマンドラインでよく使われる記述方法です。例えば、カレントディレクトリー上のファイルの、「name」という単語が含まれる行をすべて表示するには、以下のようなコマンドを使います。

リスト5 UNIXのパイプ処理
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をプロンプト実行すると、出力結果が同コンソールに表示されます。->で接続して、次のコマンドに入力されます。

次のページ
5. Jaqlを動かしてみる

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

米持 幸寿(ヨネモチ ユキヒサ)

日本アイ・ビー・エム公認 ソフトウェア・エバンジェリスト。alphaWorks、developerWorks、インキュベーション系製品、アセットなどのテクノロジーの推進をしつつ、テクノロジー戦略、エバンジェリストチームをリードしている。講演や執筆も多数。主な著書に「かんたんサーバーサイドJava」(翔泳社)、「Webサービス完全解説」(翔泳社)がある。developerWorks Japan ブログ 「米持幸寿のブログ

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/5646 2010/12/24 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング