Impalaを使ってみる

以下の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
```

```tab1.csv
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
```

```tab2.csv
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コマンドを使用する。
以下の例では３つのテーブルを作成し、それぞれのテーブルにおいて、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
```