5. Jaqlを動かしてみる
JaqlのIO
JaqlのIOは、JSONへのデータ読み込みが基礎となり、「read」と「write」の2つのビルトイン関数が基本です。
read関数やwrite関数には、引数としてタイプ、場所、オプションなどを示すJSONデータを渡す必要がありますが、これを簡単に行うための関数も用意されています。file関数やhdfs関数がそれです。例えば、ローカルファイルのカレントディレクトリーにある「NameRank.json」を読み込むなら、以下の記述で可能です。
read(file("NameRank.json"))
jaqlshellで実際に動かしてみると分かりやすいと思います。内側のfile(またはhdfs)関数は、パラメーターを生成しているだけです。
jjaql> file("NameRank.json"); { "type": "local", "location": "NameRank.json" } jaql> hdfs("NameRank.json"); { "type": "hdfs", "location": "NameRank.json" }
readを付けると、実際に読み込み、戻り値としてJSONが出力されます(ただし、データ件数が大きい場合は延々表示されますのでやめておいたほうがよいです)。
jjaql> read(file("NameRank.json")); [ { "head-count": 78, "name": "鈴木 健太", "position": 1 }, { "head-count": 73, "name": "佐藤 匠", : :
件数が多い場合は、「top」という演算子を使うと件数を減らすことができます(bottomはないようです……)。
jjaql> read(file("NameRank.json")) -> top 10; [ { "head-count": 78, "name": "鈴木 健太", "position": 1 }, { "head-count": 73, "name": "佐藤 匠", : :
write関数は、書き込みですから、データを渡す必要があります。例えば、ファイルをローカルからHDFSにコピーしてみます。
jjaql> read(file("NameRank.json")) -> write(hdfs("NameRank.json")); { "type": "hdfs", "location": "NameRank.json" }
writeの結果出力はファイルの属性を示すJSONとなっていることが分かります。この値をreadに渡すと、また読み込むことも可能だということが分かります。
変数への代入
データを読み込んで、何度も使う場合、$変数に入れておくと便利です。
jjaql> $rank = read(file("NameRank.json"));
データを削る
filterで簡単にデータの抽出ができます。例えば、head-count(今回のデータでは、同姓同名の人が何人いるか、という数字)が、10(人)以上のデータだけを抽出するとしたら、以下のようなコマンドで実行できます。
jjaql> $rank -> filter $.head-count > 10; ・・・結果は割愛
次のように、途中に改行を入れても構いません。
jjaql> $rank -> filter $.head-count > 10; ・・・結果は割愛
この状態だと、コンソールに表示されますが、ファイルに書き出しても構いません。
jaql> $rank -> filter $.head-count > 10 -> write(hdfs("NameRank10.json")); { "type": "hdfs", "location": "NameRank10.json" }