beelineでhiveのtableを作成してみて、meta情報を覗いてみた

[前回の投稿](http://qiita.com/letusfly85/items/e9c493901538cb7205a0)で、hiveのdatabaseを作成しました。

本日はテーブルを作成して、meta情報を確認してみます。


# 1. beelineでhiveserver2に接続

```bash
# コンテナにdocker-xecで/bin/bashで入ってから、beelineと入力

$ docker exec -it dockercompose_hiveserver2_1 /bin/bash
root@6a715b5d374e:/# beeline

# hiveserver2に接続
beeline> !connect jdbc:hive2://localhost:10000 hive hive org.apache.hive.jdbc.HiveDriver
```

# 2. tableを作成する

以下のddlをクリップボードに貼り付けて、beelineで発行しました。

Points.

* テーブル、カラムに付与するコメントがOracleやMySQLとはことなって、`create table`構文中で記載できます。
* テーブルに、コメント以外にMap形式でpropertyを付与することが可能です。
* location句で、ファイルパスを指定することが可能です。

```sql
create table if not exists erdrepo.ms_tables (
  column_attribute string comment 'attributes of column',
  column_score float comment 'evaluation of column'
)
comment 'dummy table'
location '/user/hive/warehouse/erdrepo.db/ms_tables'
tblproperties ('author'='letusfly85', 'create_comment'='start erdrepo')
;
```

実行の出力結果は以下のとおりです。

```sql
0: jdbc:hive2://localhost:10000> show databases;
+----------------+--+
| database_name  |
+----------------+--+
| default        |
| erdrepo        |
+----------------+--+
2 rows selected (0.167 seconds)
0: jdbc:hive2://localhost:10000> use erdrepo;
No rows affected (0.072 seconds)
0: jdbc:hive2://localhost:10000> create table if not exists erdrepo.ms_tables (
0: jdbc:hive2://localhost:10000>   column_attribute string comment 'attributes of column',
0: jdbc:hive2://localhost:10000>   column_score float comment 'evaluation of column'
0: jdbc:hive2://localhost:10000> )
0: jdbc:hive2://localhost:10000> comment 'dummy table'
0: jdbc:hive2://localhost:10000> location '/user/hive/warehouse/erdrepo.db/ms_tables'
0: jdbc:hive2://localhost:10000> tblproperties ('author'='letusfly85', 'create_comment'='start erdrepo')
0: jdbc:hive2://localhost:10000> ;
No rows affected (0.322 seconds)
0: jdbc:hive2://localhost:10000> show tables;
+------------+--+
|  tab_name  |
+------------+--+
| ms_tables  |
+------------+--+

```

# 3. meta情報を出力する

MySQLやOracleと同感覚で`descirbe`コマンドを発行してみます。

```sql
0: jdbc:hive2://localhost:10000> describe ms_tables;
+-------------------+------------+-----------------------+--+
|     col_name      | data_type  |        comment        |
+-------------------+------------+-----------------------+--+
| column_attribute  | string     | attributes of column  |
| column_score      | float      | evaluation of column  |
+-------------------+------------+-----------------------+--+
```

ここまでは想定どおりですが、やっぱりもっと詳細な情報がみたいです。
少なくともDDLで記載した内容は見たいです。

ということで、確認しました。
詳細に情報を見たい場合は、`extended`を利用します。
が、整形されずに出てしまうので、`formatted`オプションを使用することが
[マニュアル](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-DescribeTable/View/Column)では推奨されています。

出力すると以下のようになりました。

```sql
0: jdbc:hive2://localhost:10000> describe formatted ms_tables;
+-------------------------------+-------------------------------------------------------------+-----------------------+--+
|           col_name            |                          data_type                          |        comment        |
+-------------------------------+-------------------------------------------------------------+-----------------------+--+
| # col_name                    | data_type                                                   | comment               |
|                               | NULL                                                        | NULL                  |
| column_attribute              | string                                                      | attributes of column  |
| column_score                  | float                                                       | evaluation of column  |
|                               | NULL                                                        | NULL                  |
| # Detailed Table Information  | NULL                                                        | NULL                  |
| Database:                     | erdrepo                                                     | NULL                  |
| Owner:                        | hive                                                        | NULL                  |
| CreateTime:                   | Fri Nov 06 02:16:37 UTC 2015                                | NULL                  |
| LastAccessTime:               | UNKNOWN                                                     | NULL                  |
| Protect Mode:                 | None                                                        | NULL                  |
| Retention:                    | 0                                                           | NULL                  |
| Location:                     | file:/user/hive/warehouse/erdrepo.db/ms_tables              | NULL                  |
| Table Type:                   | MANAGED_TABLE                                               | NULL                  |
| Table Parameters:             | NULL                                                        | NULL                  |
|                               | author                                                      | letusfly85            |
|                               | comment                                                     | dummy table           |
|                               | create_comment                                              | start erdrepo         |
|                               | transient_lastDdlTime                                       | 1446776197            |
|                               | NULL                                                        | NULL                  |
| # Storage Information         | NULL                                                        | NULL                  |
| SerDe Library:                | org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe          | NULL                  |
| InputFormat:                  | org.apache.hadoop.mapred.TextInputFormat                    | NULL                  |
| OutputFormat:                 | org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat  | NULL                  |
| Compressed:                   | No                                                          | NULL                  |
| Num Buckets:                  | -1                                                          | NULL                  |
| Bucket Columns:               | []                                                          | NULL                  |
| Sort Columns:                 | []                                                          | NULL                  |
| Storage Desc Params:          | NULL                                                        | NULL                  |
|                               | serialization.format                                        | 1                     |
+-------------------------------+-------------------------------------------------------------+-----------------------+--+
30 rows selected (0.126 seconds)

```

BucketカラムやSortカラムみたいな属性もあるんですね。。

Compressed属性もあるということは、圧縮みたいなことも可能なのでしょうか。ここも今後要チェックです。

# 4. metastoreの情報を直接見てみる

MySQLのinformation_schema, Oracleのdictionaryに類するパブリックビューを参照する感覚で、hiveのmetastore管理のMySQLのdatabaseを見てみました。

## 4-1. metastoreのdatabaseにログインする

```sql
oot@6a715b5d374e:/# mysql -uhive -phive
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 5.5.46-0ubuntu0.14.04.2 (Ubuntu)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| metastore          |
+--------------------+
2 rows in set (0.00 sec)

mysql> use metastore;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+---------------------------+
| Tables_in_metastore       |
+---------------------------+
| BUCKETING_COLS            |
| CDS                       |
| COLUMNS_V2                |
| COMPACTION_QUEUE          |
| COMPLETED_TXN_COMPONENTS  |
| DATABASE_PARAMS           |
| DBS                       |
| DB_PRIVS                  |
| DELEGATION_TOKENS         |
| FUNCS                     |
| FUNC_RU                   |
| GLOBAL_PRIVS              |
| HIVE_LOCKS                |
| IDXS                      |
| INDEX_PARAMS              |
| MASTER_KEYS               |
| NEXT_COMPACTION_QUEUE_ID  |
| NEXT_LOCK_ID              |
| NEXT_TXN_ID               |
| NUCLEUS_TABLES            |
| PARTITIONS                |
| PARTITION_EVENTS          |
| PARTITION_KEYS            |
| PARTITION_KEY_VALS        |
| PARTITION_PARAMS          |
| PART_COL_PRIVS            |
| PART_COL_STATS            |
| PART_PRIVS                |
| ROLES                     |
| ROLE_MAP                  |
| SDS                       |
| SD_PARAMS                 |
| SEQUENCE_TABLE            |
| SERDES                    |
| SERDE_PARAMS              |
| SKEWED_COL_NAMES          |
| SKEWED_COL_VALUE_LOC_MAP  |
| SKEWED_STRING_LIST        |
| SKEWED_STRING_LIST_VALUES |
| SKEWED_VALUES             |
| SORT_COLS                 |
| TABLE_PARAMS              |
| TAB_COL_STATS             |
| TBLS                      |
| TBL_COL_PRIVS             |
| TBL_PRIVS                 |
| TXNS                      |
| TXN_COMPONENTS            |
| TYPES                     |
| TYPE_FIELDS               |
| VERSION                   |
+---------------------------+
51 rows in set (0.00 sec)
```

わらわらとテーブルを持っていますね。。お目当てなのは、TBLSとTBL_COL_STATSかな、と当たりをつけてみてみます。

## 4-2. TBLSテーブルの参照

`TBL_ID`、、、、table_idのが自分としてはしっくり来ますが、なるほど！と言った感じです。

```sql
mysql> describe TBLS;
+--------------------+--------------+------+-----+---------+-------+
| Field              | Type         | Null | Key | Default | Extra |
+--------------------+--------------+------+-----+---------+-------+
| TBL_ID             | bigint(20)   | NO   | PRI | NULL    |       |
| CREATE_TIME        | int(11)      | NO   |     | NULL    |       |
| DB_ID              | bigint(20)   | YES  | MUL | NULL    |       |
| LAST_ACCESS_TIME   | int(11)      | NO   |     | NULL    |       |
| OWNER              | varchar(767) | YES  |     | NULL    |       |
| RETENTION          | int(11)      | NO   |     | NULL    |       |
| SD_ID              | bigint(20)   | YES  | MUL | NULL    |       |
| TBL_NAME           | varchar(128) | YES  | MUL | NULL    |       |
| TBL_TYPE           | varchar(128) | YES  |     | NULL    |       |
| VIEW_EXPANDED_TEXT | mediumtext   | YES  |     | NULL    |       |
| VIEW_ORIGINAL_TEXT | mediumtext   | YES  |     | NULL    |       |
| LINK_TARGET_ID     | bigint(20)   | YES  | MUL | NULL    |       |
+--------------------+--------------+------+-----+---------+-------+
12 rows in set (0.00 sec)
```

```sql
mysql> select * from TBLS  where TBL_NAME='ms_tables'\G
*************************** 1. row ***************************
            TBL_ID: 6
       CREATE_TIME: 1446776197
             DB_ID: 7
  LAST_ACCESS_TIME: 0
             OWNER: hive
         RETENTION: 0
             SD_ID: 6
          TBL_NAME: ms_tables
          TBL_TYPE: MANAGED_TABLE
VIEW_EXPANDED_TEXT: NULL
VIEW_ORIGINAL_TEXT: NULL
    LINK_TARGET_ID: NULL
1 row in set (0.00 sec)
```

さらに、カラム情報も見てみます。

```sql
mysql> describe TAB_COL_STATS
    -> ;
+------------------------+---------------+------+-----+---------+-------+
| Field                  | Type          | Null | Key | Default | Extra |
+------------------------+---------------+------+-----+---------+-------+
| CS_ID                  | bigint(20)    | NO   | PRI | NULL    |       |
| DB_NAME                | varchar(128)  | NO   |     | NULL    |       |
| TABLE_NAME             | varchar(128)  | NO   |     | NULL    |       |
| COLUMN_NAME            | varchar(128)  | NO   |     | NULL    |       |
| COLUMN_TYPE            | varchar(128)  | NO   |     | NULL    |       |
| TBL_ID                 | bigint(20)    | NO   | MUL | NULL    |       |
| LONG_LOW_VALUE         | bigint(20)    | YES  |     | NULL    |       |
| LONG_HIGH_VALUE        | bigint(20)    | YES  |     | NULL    |       |
| DOUBLE_HIGH_VALUE      | double(53,4)  | YES  |     | NULL    |       |
| DOUBLE_LOW_VALUE       | double(53,4)  | YES  |     | NULL    |       |
| BIG_DECIMAL_LOW_VALUE  | varchar(4000) | YES  |     | NULL    |       |
| BIG_DECIMAL_HIGH_VALUE | varchar(4000) | YES  |     | NULL    |       |
| NUM_NULLS              | bigint(20)    | NO   |     | NULL    |       |
| NUM_DISTINCTS          | bigint(20)    | YES  |     | NULL    |       |
| AVG_COL_LEN            | double(53,4)  | YES  |     | NULL    |       |
| MAX_COL_LEN            | bigint(20)    | YES  |     | NULL    |       |
| NUM_TRUES              | bigint(20)    | YES  |     | NULL    |       |
| NUM_FALSES             | bigint(20)    | YES  |     | NULL    |       |
| LAST_ANALYZED          | bigint(20)    | NO   |     | NULL    |       |
+------------------------+---------------+------+-----+---------+-------+
19 rows in set (0.00 sec)
```

TBL_NAMEを指定して、見てみます。

```sql
mysql> select * from TAB_COL_STATS where TABLE_NAME='ms_tables'\G
Empty set (0.00 sec)
```

な、何もヒットしません。。
カラム名が、TBL_NAMEではなく、TABLE_NAMEなのもちょっと不自然ですが、これに入ってないのも不自然。。

その後いくつか眺めてみて、以下にたどり着きました。

```sql
mysql> select * From COLUMNS_V2 where CD_ID=6;
+-------+----------------------+------------------+-----------+-------------+
| CD_ID | COMMENT              | COLUMN_NAME      | TYPE_NAME | INTEGER_IDX |
+-------+----------------------+------------------+-----------+-------------+
|     6 | attributes of column | column_attribute | string    |           0 |
|     6 | evaluation of column | column_score     | float     |           1 |
+-------+----------------------+------------------+-----------+-------------+
2 rows in set (0.00 sec)
```

COLUMNS_V2というテーブル名はどうなんだろ。。。と思いつつも、メタ情報管理のテーブルには辿りつけました。

ココらへんのテーブル整理は、利用するhiveのバージョン次第で変わるとも思いますし、運用にも関わるので、どこかで深掘りする時間も必要かな、と思いました。


今日はここまでとします。

次回はindexを見ていこうと思います。

# 5. おまけ

物理属性と論理属性のどちらもが、key, value形式で格納されているテーブル。
テーブルとしてどうなの、というところはおいておいて入っている情報は有用そう。

```sql
mysql> describe TABLE_PARAMS;
+-------------+---------------+------+-----+---------+-------+
| Field       | Type          | Null | Key | Default | Extra |
+-------------+---------------+------+-----+---------+-------+
| TBL_ID      | bigint(20)    | NO   | PRI | NULL    |       |
| PARAM_KEY   | varchar(256)  | NO   | PRI | NULL    |       |
| PARAM_VALUE | varchar(4000) | YES  |     | NULL    |       |
+-------------+---------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

mysql> select * from TABLE_PARAMS;
+--------+-----------------------+---------------+
| TBL_ID | PARAM_KEY             | PARAM_VALUE   |
+--------+-----------------------+---------------+
|      1 | COLUMN_STATS_ACCURATE | true          |
|      1 | numFiles              | 2             |
|      1 | numRows               | 1             |
|      1 | rawDataSize           | 1             |
|      1 | totalSize             | 2             |
|      1 | transient_lastDdlTime | 1446483398    |
|      2 | COLUMN_STATS_ACCURATE | true          |
|      2 | numFiles              | 1             |
|      2 | numRows               | 1             |
|      2 | rawDataSize           | 1             |
|      2 | totalSize             | 2             |
|      2 | transient_lastDdlTime | 1446483367    |
|      6 | author                | letusfly85    |
|      6 | comment               | dummy table   |
|      6 | create_comment        | start erdrepo |
|      6 | transient_lastDdlTime | 1446776197    |
+--------+-----------------------+---------------+
16 rows in set (0.00 sec)
```