本篇主要是介紹Hive在MySQL中存儲的源數據的表結構。
Hive MetaStore 數據庫表結構圖
test.png
TBLS
記錄數據表的信息
字段
解釋
TBL_ID
在hive中創建表的時候自動生成的一個id,用來表示,主鍵
CREATE_TIME
創建的數據表的時間,使用的是時間戳
DBS_ID
這個表是在那個數據庫里面
LAST_ACCESS_TIME
最后一次訪問的時間戳
OWNER
數據表的所有者
RETENTION
保留時間
SD_ID
標記物理存儲信息的id
TBL_NAME
數據表的名稱
TBL_TYPE
數據表的類型,MANAGED_TABLE, EXTERNAL_TABLE, VIRTUAL_VIEW, INDEX_TABLE
VIEW_EXPANDED_TEXT
展開視圖文本,非視圖為null
VIEW_ORIGINAL_TEXT
原始視圖文本,非視圖為null
TBLS的SD_ID與SDS的SD_ID進行關聯,TBLS的DB_ID與DBS的DB_ID進行關聯,相關的thrift類為Table,StorageDescriptor。
//由于TBLS與DBS有關聯,可以看到當前表是數據那個數據庫。
//表的信息
mysql> select * from tbls where tbl_id=71 and db_id=1;
+--------+-------------+-------+------------------+--------+-----------+-------+----------+---------------+--------------------+--------------------+
| TBL_ID | CREATE_TIME | DB_ID | LAST_ACCESS_TIME | OWNER | RETENTION | SD_ID | TBL_NAME | TBL_TYPE | VIEW_EXPANDED_TEXT | VIEW_ORIGINAL_TEXT |
+--------+-------------+-------+------------------+--------+-----------+-------+----------+---------------+--------------------+--------------------+
| 71 | 1548340018 | 1 | 0 | hadoop | 0 | 91 | emp | MANAGED_TABLE | NULL | NULL |
+--------+-------------+-------+------------------+--------+-----------+-------+----------+---------------+--------------------+--------------------+
//數據庫的信息
mysql> select * from dbs where db_id=1;
+-------+-----------------------+-------------------------------------------+---------+------------+------------+
| DB_ID | DESC | DB_LOCATION_URI | NAME | OWNER_NAME | OWNER_TYPE |
+-------+-----------------------+-------------------------------------------+---------+------------+------------+
| 1 | Default Hive database | hdfs://hadoop001:9000/user/hive/warehouse | default | public | ROLE |
+-------+-----------------------+-------------------------------------------+---------+------------+------------+
Version
這個表是記錄Hive的版本,這個表里面只能有一條記錄,這樣Hive才能啟動。在創建源數據表的時候,自動寫入的信息。相關的thrift類為version。
在初始化源數據表的時候,插入一條數據。
INSERT INTO VERSION (VER_ID, SCHEMA_VERSION, VERSION_COMMENT) VALUES (1, '1.1.0', 'Hive release version 1.1.0');
//獲取到的結果為:
mysql> select * from version;
+--------+----------------+--------------------------------------+
| VER_ID | SCHEMA_VERSION | VERSION_COMMENT |
+--------+----------------+--------------------------------------+
| 1 | 1.1.0 | Set by MetaStore hadoop@10.140.42.16 |
+--------+----------------+--------------------------------------+
DBS
記錄數據庫的信息
字段
解釋
DB_ID
數據庫的編號,默認的數據庫編號為1,如果創建其他數據庫的時候,這個字段會自增,主鍵
DESC
對數據庫進行一個簡單的介紹
DB_LOCATION_URI
數據庫的存放位置,默認是存放在hdfs://ip:9000/user/hive/warehouse,如果是其他數據庫,就在后面添加目錄,默認位置可以通過參數hive.metastore.warehouse.dir來設置
NAME
數據庫的名稱
OWNER_NAME
數據庫所有者名稱
OWNER_TYPE
數據庫所有者的類型
DBS的DB_ID與DATABASE_PARAMS的DB_ID進行關聯。
相關的thrift類為Database
#查看所有的數據庫
mysql> select * from dbs;
+-------+-----------------------+------------------------------------------------------+---------+------------+------------+
| DB_ID | DESC | DB_LOCATION_URI | NAME | OWNER_NAME | OWNER_TYPE |
+-------+-----------------------+------------------------------------------------------+---------+------------+------------+
| 1 | Default Hive database | hdfs://hadoop001:9000/user/hive/warehouse | default | public | ROLE |
| 2 | NULL | hdfs://hadoop001:9000/user/hive/warehouse/xiaoyao.db | xiaoyao | hadoop | USER |
+-------+-----------------------+------------------------------------------------------+---------+------------+------------+
TABLE_PARAMS
字段
解釋
TBL_ID
數據的編號
PARAM_KEY
參數
PARAM_VALUE
參數的值
TABLE_PARAMS的TBL_ID與TBLS的TBL_ID的進行關聯,TBL_ID與PARAM_KEY作為聯合主鍵。
每個表的信息基本上都有如下屬性:
參數
值
COLUMN_STATS_ACCURATE
精確統計列
numFiles
文件數
numRows
行數
rawDataSize
原始數據大小
totalSize
當前大小
transient_lastDdlTime
最近一次操作的時間戳
Spark相關有其他的屬性暫不解釋。
//對tbls中的數據表進行一個介紹:文件的數量、數據行數、數據總的大小等介紹
mysql> select * from table_params where tbl_id=71;
+--------+-----------------------+-------------+
| TBL_ID | PARAM_KEY | PARAM_VALUE |
+--------+-----------------------+-------------+
| 71 | COLUMN_STATS_ACCURATE | true |
| 71 | numFiles | 1 |
| 71 | numRows | 0 |
| 71 | rawDataSize | 0 |
| 71 | totalSize | 701 |
| 71 | transient_lastDdlTime | 1548340028 |
+--------+-----------------------+-------------+
SDS
此對象包含有關屬于表的數據的物理存儲的所有信息,數據表的存儲描述
字段
解釋
SD_ID
主鍵
CD_ID
數據表編號
INPUT_FORMAT
數據輸入格式
IS_COMPRESSED
是否對數據進行了壓縮
IS_STOREDASSUBDIRECTORIES
是否進行存儲在子目錄
LOCATION
數據存放位置
NUM_BUCKETS
分桶的數量
OUTPUT_FORMAT
數據的輸出格式
SERDE_ID
序列和反序列的信息
SDS的SERDE_ID與SERDES的SERDE_ID進行關聯,SDS的CD_ID與CDS的CD_ID進行關聯。相關的thrift表為StorageDescriptor。
//數據的存儲格式
mysql> select * from sds where sd_id=91;
+-------+-------+------------------------------------------+---------------+---------------------------+-----------------------------------------------+-------------+------------------------------------------------------------+----------+
| SD_ID | CD_ID | INPUT_FORMAT | IS_COMPRESSED | IS_STOREDASSUBDIRECTORIES | LOCATION | NUM_BUCKETS | OUTPUT_FORMAT | SERDE_ID |
+-------+-------+------------------------------------------+---------------+---------------------------+-----------------------------------------------+-------------+------------------------------------------------------------+----------+
| 91 | 71 | org.apache.hadoop.mapred.TextInputFormat | | | hdfs://hadoop001:9000/user/hive/warehouse/emp | -1 | org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat | 91 |
+-------+-------+------------------------------------------+---------------+---------------------------+-----------------------------------------------+-------------+------------------------------------------------------------+----------+
CDS
記錄數據表的編號
字段
解釋
CD_ID
主鍵,記錄數據表的編號
這個是一個自增的序列,就是一個標識。
SERDES
記錄序列化和反序列化信息
字段
解釋
SERDE_ID
主鍵,記錄序列化的編號
NAME
序列化和反序列化名稱,默認為表名
SLIB
使用的是哪種序列化方式
相關的thrift表為SerDeInfo
//使用何種序列化
mysql> select * from serdes where serde_id=91;
+----------+------+----------------------------------------------------+
| SERDE_ID | NAME | SLIB |
+----------+------+----------------------------------------------------+
| 91 | NULL | org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe |
+----------+------+----------------------------------------------------+
SERDES_PARAMS
字段
解釋
SERDE_ID
主鍵,記錄序列化的編號
PARAM_KEY
參數名稱
PARAM_VALUE
參數的值
SERDES_PARAMS的SERDE_ID與SERDES的SERDE_ID進行關聯。
//序列化的方式
mysql> select * from serde_params where serde_id=91;
+----------+----------------------+-------------+
| SERDE_ID | PARAM_KEY | PARAM_VALUE |
+----------+----------------------+-------------+
| 91 | field.delim | |
| 91 | serialization.format | |
+----------+----------------------+-------------+
DATABASE_PARAMS
字段
解釋
DB_ID
數據庫的編號
PARAM_KEY
參數名稱
PARAM_VALUE
參數值
DB_ID是一個主鍵,使得DBS與DATABASE_PARAMS關聯。
TAB_COL_STATS
數據表的列信息統計
字段
解釋
CS_ID
列統計編號
AVG_COL_LEN
數據的平均長度
MAX_COL_LEN
數據的最大長度
COLUMN_NAME
列的名字
COLUMN_TYPE
列的類型
DB_NAME
數據庫的名稱
BIG_DECIMAL_HIGH_VALUE
數據中最大的Decimal值
BIG_DECIMAL_LOW_VALUE
數據中最小的Decimal值
DOUBLE_HIGH_VALUE
數據中最大的Double值
DOUBLE_LOW_VALUE
數據中最小的Double值
LAST_ANALYZED
最新一次解析的時間戳
LONG_HIGH_VALUE
數據中最大的Long值
LONG_LOW_VALUE
數據中最小的Long值
NUM_DISTINCTS
不同記錄的數量
NUM_FALSES
為false的數量
NUM_NULLS
為null的數量
NUM_TRUES
為true的數量
TBL_ID
數據表的編號
TABLE_NAME
數據表的名稱
通過tbl_id使得TAB_COL_STATS與tbls關聯。
相關的thrift類有:BooleanColumnStatsData、DoubleColumnStatsData、LongColumnStatsData、StringColumnStatsData、BinaryColumnStatsData、
Decimal、DecimalColumnStatsData、ColumnStatisticsData、ColumnStatisticsObj、ColumnStatisticsDesc、ColumnStatistics
Sort_COLS
記錄要進行排序的列
字段
解釋
SD_ID
數據表物理信息描述的編號
COLUMN_NAME
列的名稱
ORDER
排序方式
COLUMNS_V2
用于描述列的信息
字段
解釋
CD_ID
表的編號
COMMENT
相關描述信息
COLUMN_NAME
列的名稱
TYPE_NAME
類的類型
這個表與cds通過cd_id關聯。
mysql> select * from columns_v2 where cd_id=71;
+-------+---------+-------------+-----------+-------------+
| CD_ID | COMMENT | COLUMN_NAME | TYPE_NAME | INTEGER_IDX |
+-------+---------+-------------+-----------+-------------+
| 71 | NULL | common | double | 6 |
| 71 | NULL | deptno | int | 7 |
| 71 | NULL | empno | int | 0 |
| 71 | NULL | ename | string | 1 |
| 71 | NULL | hiredate | string | 4 |
| 71 | NULL | job | string | 2 |
| 71 | NULL | mgr | int | 3 |
| 71 | NULL | sal | double | 5 |
+-------+---------+-------------+-----------+-------------+
FUNCS
記錄hive中函數的信息
字段
解釋
FUNC_ID
函數的編號
CLASS_NAME
自定義函數的類的名稱
CREATE_TIME
函數創建時間
DB_ID
作用于那個數據庫
FUNC_NAME
方法名稱
FUNC_TYPE
方法類型
OWNER_NAME
所有者名稱
OWNER_TYPE
所有者類型
這個表里面記錄一些hive自帶的函數和用戶自定義的函數。
相關的thrift類為Function。
FUNC_RU
對函數的相關參數進行描述。
字段
解釋
FUNC_ID
函數的便阿訇
RESOURCE_TYPE
資源的類型
RESOURCE_URI
資源的uri
相關的thrift類為:ResourceUri、ResourceType。
分區表
PARTITIONS
字段
解釋
PART_ID
分區的編號
CREATE_TIME
創建分區的時間
LAST_ACCESS_TIME
最近一次訪問時間
PART_NAME
分區的名字
SD_ID
存儲描述的id
TBL_ID
數據表的id
相關的thrift類為:Partition。
#記錄要按照某個字段的值進行分區
mysql> select * from partitions;
+---------+-------------+------------------+-----------------+-------+--------+
| PART_ID | CREATE_TIME | LAST_ACCESS_TIME | PART_NAME | SD_ID | TBL_ID |
+---------+-------------+------------------+-----------------+-------+--------+
| 16 | 1543046086 | 0 | pt=xiaoyao | 46 | 26 |
| 21 | 1543071202 | 0 | date=2016-05-05 | 56 | 32 |
+---------+-------------+------------------+-----------------+-------+--------+
PARTITION_PARAMS
字段
解釋
PART_ID
分區的編號
PARAM_KEY
參數
PARAM_VALUE
參數的值
mysql> select * from partition_params where part_id=21;
+---------+-----------------------+-------------+
| PART_ID | PARAM_KEY | PARAM_VALUE |
+---------+-----------------------+-------------+
| 21 | COLUMN_STATS_ACCURATE | true |
| 21 | numFiles | 1 |
| 21 | numRows | 0 |
| 21 | rawDataSize | 0 |
| 21 | totalSize | 604236 |
| 21 | transient_lastDdlTime | 1543071202 |
+---------+-----------------------+-------------+
PARTITION_KEYS
字段
解釋
TBL_ID
數據表的編號
PKEY_COMMENT
分區字段的描述
PKEY_NAME
分區字段的名稱
PKEY_TYPE
分區字段的類型
相關的thrift類為:FieldSchema。
//指定按照那個字段進行分區
mysql> select * from partition_keys;
+--------+--------------+-----------+-----------+-------------+
| TBL_ID | PKEY_COMMENT | PKEY_NAME | PKEY_TYPE | INTEGER_IDX |
+--------+--------------+-----------+-----------+-------------+
| 26 | NULL | pt | string | 0 |
| 32 | NULL | date | string | 0 |
+--------+--------------+-----------+-----------+-------------+
PARTITION_KEY_VALS
字段
解釋
PART_ID
分區編號
PART_KEY_VAL
分區字段的值
//按照值分區之后,這是第幾個分區
mysql> select * from partition_key_vals;
+---------+--------------+-------------+
| PART_ID | PART_KEY_VAL | INTEGER_IDX |
+---------+--------------+-------------+
| 16 | xiaoyao | 0 |
| 21 | 2016-05-05 | 0 |
+---------+--------------+-------------+
查看表的信息
//可以使用命令查看表的所有信息,分區表亦如是。
hive (default)> desc formatted emp;
#表類的信息,對應的表為:COLUMNS_V2
# col_name data_type comment
empno int
ename string
job string
mgr int
hiredate string
sal double
common double
deptno int
# 數據表的詳細信息 ,對應的數據表為:TBLS
Database: default
Owner: hadoop
CreateTime: Thu Jan 24 22:26:58 CST 2019
LastAccessTime: UNKNOWN
Protect Mode: None
Retention: 0
Location: hdfs://hadoop001:9000/user/hive/warehouse/emp
Table Type: MANAGED_TABLE
Table Parameters:
COLUMN_STATS_ACCURATE true
numFiles 1
numRows 0
rawDataSize 0
totalSize 701
transient_lastDdlTime 1548340028
# 表的存儲信息 對應的數據表為:TBLS
SerDe Library: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
InputFormat: org.apache.hadoop.mapred.TextInputFormat
OutputFormat: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
Compressed: No
Num Buckets: -1
Bucket Columns: []
Sort Columns: []
Storage Desc Params:
field.delim \t
serialization.format \t
Time taken: 0.253 seconds, Fetched: 39 row(s)
分區表信息
hive (xiaoyao)> desc formatted emp_test_p;
#列的信息
# col_name data_type comment
empno int
ename string
job string
mgr int
hiredate string
sal double
common double
deptno int
# 分區信息
# col_name data_type comment
pt string
# 表信息
Database: xiaoyao
Owner: hadoop
CreateTime: Sat Nov 24 15:50:25 CST 2018
LastAccessTime: UNKNOWN
Protect Mode: None
Retention: 0
Location: hdfs://hadoop001:9000/user/hive/warehouse/xiaoyao.db/emp_test_p
Table Type: MANAGED_TABLE
Table Parameters:
transient_lastDdlTime 1543045825
# 存儲信息
SerDe Library: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
InputFormat: org.apache.hadoop.mapred.TextInputFormat
OutputFormat: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
Compressed: No
Num Buckets: -1
Bucket Columns: []
Sort Columns: []
Storage Desc Params:
field.delim \t
serialization.format \t
刪除表
1.Hive中刪除
drop table emp;
2.在MetaStore刪除數據表
drop procedure if exists t1;
create procedure t1 ( in tbinput int)
begin
declare v_sd_id int ;
declare v_part_id int ;
declare v_cd_id int ;
declare v_serde_id int ;
select tbinput;
select SD_ID into v_sd_id from tbls where TBL_ID = tbinput;
select part_id into v_part_id from partitions where tbl_id = tbinput;
select cd_id , serde_id into v_cd_id,v_serde_id from sds where sd_id = v_sd_id;
select v_sd_id,v_part_id,v_cd_id,v_serde_id;
if v_part_id is not null then
delete from partition_params where part_id = v_part_id;
delete from partition_key_vals where part_id = v_part_id;
end if;
delete from serdes where serde_id = v_serde_id;
delete from serde_params where serde_id = v_serde_id;
delete from columns_v2 where cd_id = v_cd_id;
delete from sds where sd_id = v_sd_id;
delete from partitions where tbl_id = tbinput;
delete from partition_keys where tbl_id = tbinput;
delete from table_params where tbl_id = tbinput;
delete from tbls where tbl_id = tbinput;
end ;
存放sql語句的位置:hive-1.1.0-cdh5.7.0/metastore/scripts/upgrade/mysql/hive-schema-1.1.0.mysql.sql
存放thrift相關文件的位置:hive-1.1.0-cdh5.7.0/metastore/if/hive_metastore.thrift
存放java相關文件的位置:hive-1.1.0-cdh5.7.0/metastore/src/gen/thrift/gen-javabean/org/apache/hadoop/hive/metastore/api
參考文檔: