Hello, World!
$ nl hello.jql
1 [{text: 'Hello, World!'}] -> write(file('hoge.json'));
2 read(file('hoge.json'));
3 quit;
$ jaqlshell -cb hello.jql
{
"location": "hoge.json",
"type": "local"
}
[
{
"text": "Hello, World!"
}
]Jaqlが扱うデータはJSON形式で記述します。
JSON形式のデータを受け取って、JSON形式のデータを出力する関数を "->" 記号でつなぐことで、データ処理を行っていきます。(Unix/Linuxのパイプ処理に似た感覚です。)
処理の最初の入力となるデータを「ソース」、最後の出力先を「シンク」といいます。(シンクの指定がない場合は、標準出力に書き出されます。)
1行目:JSONデータを直接記述した「リテラル」がソースで、ローカルファイルシステムのテキストファイル "hoge.json" がシンクになります。
2行目:テキストファイル "hoge.json" がソースで、シンクの指定はありません。従って、hoge.json の内容がそのまま標準出力に出力されます。
write()関数とread()関数で読み書きするファイルシステムには、ローカルファイルシステム以外に、HDFSやHBaseのテーブルが使用できます。ディレクトリ内のファイルをワイルドカードで一括指定することもできます。
$ nl hello_hdfs.jql
1 [{text: 'Hello World'}] -> write(hdfs('hello/file1'));
2 [{text: 'No. Thank you.'}] -> write(hdfs('hello/file2'));
3 read(hdfs('hello/file1'));
4 read(hdfs('hello/file2'));
5 read(hdfs('hello/*'));
6 quit;
$ jaqlshell -cb hello_hdfs.jql
{
"location": "hello/file1",
"type": "hdfs"
}
{
"location": "hello/file2",
"type": "hdfs"
}
[
{
"text": "Hello World"
}
]
[
{
"text": "No. Thank you."
}
]
[
{
"text": "Hello World"
},
{
"text": "No. Thank you."
}
]ディレクトリ内のファイルを一括指定した場合は、複数ファイルの内容が1つのJSONデータとしてまとめられていることが分かります。
JSON形式になっていないテキストファイルをソースにする場合は、テキストファイルからJSONへのコンバータ関数を用意して、read()による読み込み時に自動変換することができます。⇒ こちらを参照。
デフォルトで用意されているコンバータを利用すると、テキストファイルや CSV ファイルを簡単に読み込むことができます。
(参照)src/test/com/ibm/jaql/storageTextQueries.txt
たとえば、read(lines()) を用いると、テキストファイルを1行ごとのストリングの配列として読み込みます。
$ ls -l / > text.txt
$ hadoop fs -copyFromLocal text.txt root.txt
$ jaqlshell -c
Initializing Jaql.
jaql> read(lines("root.txt"));
[
"total 92",
"drwxr-xr-x 2 root root 4096 Nov 16 11:36 bin",
"drwxr-xr-x 3 root root 4096 Apr 23 2009 boot",
"drwxr-xr-x 15 root root 3580 Nov 16 12:24 dev",
"drwxr-xr-x 5 hadoop hadoop 4096 Nov 16 12:33 disk01",
"drwxr-xr-x 40 root root 4096 Nov 24 12:38 etc",
"drwxr-xr-x 3 root root 4096 Nov 16 11:38 home",
"drwxr-xr-x 6 root root 4096 Apr 23 2009 lib",
"drwxr-xr-x 5 root root 4096 Apr 23 2009 lib64",
"drwx------ 2 root root 16384 Apr 23 2009 lost+found",
"drwxr-xr-x 2 root root 4096 Nov 16 06:49 mnt",
"drwxr-xr-x 5 root root 4096 Nov 16 11:38 opt",
"dr-xr-xr-x 86 root root 0 Nov 16 07:24 proc",
"drwxr-x--- 4 root root 4096 Nov 16 12:43 root",
"drwxr-xr-x 2 root root 4096 Apr 23 2009 sbin",
"drwxr-xr-x 2 root root 4096 Mar 11 2009 selinux",
"drwxr-xr-x 2 root root 4096 Mar 11 2009 srv",
"drwxr-xr-x 12 root root 0 Nov 16 07:24 sys",
"drwxrwxrwt 302 root root 16384 Nov 26 07:23 tmp",
"drwxr-xr-x 16 root root 4096 Nov 16 11:38 usr",
"drwxr-xr-x 17 root root 4096 Apr 23 2009 var"
]