めもめも

このブログに記載の内容は個人の見解であり、必ずしも所属組織の立場、戦略、意見を代表するものではありません。

Jaql入門(1) - データフローと I/O

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