LoginSignup
3
5

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-11-06

前回の投稿で、hiveのdatabaseを作成しました。

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

1. beelineでhiveserver2に接続

# コンテナに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句で、ファイルパスを指定することが可能です。
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')
;

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

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コマンドを発行してみます。

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オプションを使用することが
マニュアルでは推奨されています。

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

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にログインする

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のが自分としてはしっくり来ますが、なるほど!と言った感じです。

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)
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)

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

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を指定して、見てみます。

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

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

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

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形式で格納されているテーブル。
テーブルとしてどうなの、というところはおいておいて入っている情報は有用そう。

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)
3
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
5