以下のImpalaチュートリアルを読みながら実際に動作確認して理解を深めていく。
http://www.cloudera.com/content/www/en-us/documentation/archive/impala/1-x/1-4-x/Installing-and-Using-Impala/ciiu_tutorial.html
※途中なので後ほど加筆修正
1. 基本的な.csvテーブルをセットアップ
> hdfs dfs -mkdir -p /user/sample/sample_data/tab1 /user/sample/sample_data/tab2
1,true,123.123,2012-10-24 08:55:00
2,false,1243.5,2012-10-25 13:40:00
3,false,24453.325,2008-08-22 09:33:21.123
4,false,243423.325,2007-05-12 22:32:21.33454
5,true,243.325,1953-04-22 09:11:33
1,true,12789.123
2,false,1243.5
3,false,24453.325
4,false,2423.3254
5,true,243.325
60,false,243565423.325
70,true,243.325
80,false,243423.325
90,true,243.325
それぞれの.csvファイルを異なるHDFSディレクトリに格納する。
> hdfs dfs -put tab1.csv /user/sample/sample_data/tab1
> hdfs dfs -ls /user/sample/sample_data/tab1
Found 1 items
-rw-r--r-- 3 hdfs supergroup 193 2015-11-01 22:07 /user/sample/sample_data/tab1/tab1.csv
> hdfs dfs -put tab2.csv /user/sample/sample_data/tab2
> hdfs dfs -ls /user/sample/sample_data/tab2
Found 1 items
-rw-r--r-- 3 hdfs supergroup 158 2015-11-01 22:09 /user/sample/sample_data/tab2/tab2.csv
※/user/sampleがImpalaユーザからアクセスできないとWarning(WARNINGS: Impala does not have READ_WRITE access to path 'hdfs://xxxxxxx:8020/user/sample/sample_data')がでるため、impalaユーザにとりあえず変更。
hdfs dfs -chown -R impala:supergroup /user/sample
Impalaがデータディレクトリのコンテツを調べるとき、ディレクトリ内の全てのファイルはテーブルのデータとしてまとめられる。
テーブルを作成するには、impala-shellコマンドを使用する。
以下の例では3つのテーブルを作成し、それぞれのテーブルにおいて、Booleanやintegerなどの属性を持つカラムの作成を行っている。csvファイルからインポートするデータのフォーマット(カンマ区切りなど)の情報を与えている。csvファイルは既にHDFS上にあるので、その場所を示しチエる。Impalaはディレクトリにある全てのファイルデータを取り出し、テーブルに登録するデータとみなす。
$ impala-shell
> DROP TABLE IF EXISTS tab1;
Query: drop TABLE IF EXISTS tab1
> CREATE EXTERNAL TABLE tab1 ( id INT, col_1 BOOLEAN, col_2 DOUBLE, col_3 TIMESTAMP) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION '/user/sample/sample_data/tab1';
Fetched 0 row(s) in 0.05s
> DROP TABLE IF EXISTS tab2;
Query: drop TABLE IF EXISTS tab2
> CREATE EXTERNAL TABLE tab2 (id INT, col_1 BOOLEAN, col_2 DOUBLE) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION '/user/sample/sample_data/tab2';
> DROP TABLE IF EXISTS tab3;
Query: drop TABLE IF EXISTS tab3
> > CREATE EXTERNAL TABLE tab3 (id INT, col_1 BOOLEAN, col_2 DOUBLE,month INT, day INT ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
4. Impalaテーブルから検索
4.1. Examining Contents of Tables
$ impala-shell
> show tables;
Query: show tables
+-----------+
| name |
+-----------+
| tab1 |
| tab2 |
| tab3 |
+-----------+
> select * from tab1;
Query: select * from tab1
+----+-------+------------+-------------------------------+
| id | col_1 | col_2 | col_3 |
+----+-------+------------+-------------------------------+
| 1 | true | 123.123 | 2012-10-24 08:55:00 |
| 2 | false | 1243.5 | 2012-10-25 13:40:00 |
| 3 | false | 24453.325 | 2008-08-22 09:33:21.123000000 |
| 4 | false | 243423.325 | 2007-05-12 22:32:21.334540000 |
| 5 | true | 243.325 | 1953-04-22 09:11:33 |
+----+-------+------------+-------------------------------+
> SELECT * FROM tab2 LIMIT 5;
Query: select * FROM tab2 LIMIT 5
+----+-------+-----------+
| id | col_1 | col_2 |
+----+-------+-----------+
| 1 | true | 12789.123 |
| 2 | false | 1243.5 |
| 3 | false | 24453.325 |
| 4 | false | 2423.3254 |
| 5 | true | 243.325 |
+----+-------+-----------+
$ cat query.sql
SELECT * FROM tab1;
SELECT * FROM tab2;
SELECT * FROM tab2 LIMIT 5;
$ impala-shell -f query.sql
4.2. Example: Aggregate and Join
テーブルtab1とtab2をid列で結合(USINGで条件指定)。
> select tab1.col_1, MAX(tab2.col_2),MIN(tab2.col_2) FROM tab2 JOIN tab1 USING(id) GROUP BY col_1 ORDER BY 1 LIMIT 5;
Query: select tab1.col_1, MAX(tab2.col_2),MIN(tab2.col_2) FROM tab2 JOIN tab1 USING(id) GROUP BY col_1 ORDER BY 1 LIMIT 5
+-------+-----------------+-----------------+
| col_1 | max(tab2.col_2) | min(tab2.col_2) |
+-------+-----------------+-----------------+
| false | 24453.325 | 1243.5 |
| true | 12789.123 | 243.325 |
+-------+-----------------+-----------------+
Fetched 2 row(s) in 0.71s