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" ]