獲取hive建表語句
阿新 • • 發佈:2019-01-11
在使用hive進行開發時,我們往往需要獲得一個已存在hive表的建表語句(DDL),然而hive本身並沒有提供這樣一個工具。
要想還原建表DDL就必須從元資料入手,我們知道,hive的元資料並不存放在hdfs上,而是存放在傳統的RDBMS中,典型的如mysql,derby等,這裡我們以mysql為元資料庫,結合0.4.2版本的hive為例進行研究。
連線上mysql後可以看到hive元資料對應的表約有20個,其中和表結構資訊有關的有9張,其餘的10多張或為空,或只有簡單的幾條記錄,以下是部分主要表的簡要說明。
表名 | 說明 | 關聯鍵 |
TBLS | 所有hive表的基本資訊 | TBL_ID,SD_ID |
TABLE_PARAM | 表級屬性,如是否外部表,表註釋等 | TBL_ID |
COLUMNS | Hive表字段資訊(欄位註釋,欄位名,欄位型別,欄位序號) | SD_ID |
SDS | 所有hive表、表分割槽所對應的hdfs資料目錄和資料格式 | SD_ID,SERDE_ID |
SERDE_PARAM | 序列化反序列化資訊,如行分隔符、列分隔符、NULL的表示字元等 | SERDE_ID |
PARTITIONS | Hive表分割槽資訊 | PART_ID,SD_ID,TBL_ID |
PARTITION_KEYS | Hive分割槽表分割槽鍵 | TBL_ID |
PARTITION_KEY_VALS | Hive表分割槽名(鍵值) | PART_ID |
除了上面幾張表外,還有兩張表非常有趣:NUCLEUS_TABLES和SEQUENCE_TABLE
- NUCLEUS_TABLES表中儲存了元資料表和hive中class類的對應關係,如’org.apache.hadoop.hive.metastore.model.MTable’, ‘`TBLS`’,說明MTable類對應了元資料的TBLS表,不難想象當我們建立一張表時,hive一定會通過MTable的DAO模式向TBLS插入一條資料用來描述剛剛建立的hive表。NUCLEUS_TABLES表內現在共有17條這樣的記錄。
- SEQUENCE_TABLE表儲存了hive物件的下一個可用ID,如’org.apache.hadoop.hive.metastore.model.MTable’, 271786,則下一個新建立的hive表其TBL_ID就是271786,同時SEQUENCE_TABLE表中271786被更新為271791(這裡每次都是+5而不是預料中的+1,有些奇怪)。同樣,COLUMN,PARTITION等都有相應的記錄。
從上面兩張表的內容來看,hive表建立表的過程已經比較清楚了
- 解析使用者提交hive語句,對其進行解析,分解為表、欄位、分割槽等hive物件
- 根據解析到的資訊構建對應的表、欄位、分割槽等物件,從SEQUENCE_TABLE中獲取構建物件的最新ID,與構建物件資訊(名稱,型別等)一同通過DAO方法寫入到元資料表中去,成功後將SEQUENCE_TABLE中對應的最新ID+5。
實際上我們常見的RDBMS都是通過這種方法進行組織的,典型的如postgresql,其系統表中和hive元資料一樣裸露了這些id資訊(oid,cid等),而Oracle等商業化的系統則隱藏了這些具體的ID。
有了上面的資訊,再想獲得hive的建表語句已經是易如反掌了,這裡提供一個已經開發好的指令碼,使用shell開發,大家可以自由修改。注意:其中mysql連線資訊請根據實際環境進行配置。
使用方法如下:
- hivesql sql <table|file> — 獲取指定hive表或指定檔案中所有hive表的DDL,如果有按天的分割槽則預設執行最近7天的分割槽DDL。同時,table支援符合sql語法的正則表示式,如果有多個表匹配,則提示使用者選擇(使用file則自動關閉該互動功能)。
- hivesql synctab <table|file> — 基本同上,但是會將得到的DDL提交到當前的hive環境,可用來在不同的hive環境中複製表結構。
如果需要多天分割槽DDL還可以這樣用(前提是分割槽中含有日期資訊,如pt=20100720):
- hivesql sql s_table 20100702 — 除建表語句外,獲得自20100702以來的分割槽DDL
- hivesql sql s_table 20100702 20100725 — ………………………..自20100702-20100725的分割槽DDL
- hivesql sql s_table 20100702 10 — ………………………..自20100702起10天的分割槽DDL
hivesql synctab和hivesql sql一樣支援上述日期限定功能。
此外,還提供了兩個附加的功能(也很有用呃)
- hivesql loc <reg> — 根據關鍵字查詢能夠匹配到的hive表或對應的資料路徑
- hivesql hdfswc <hdfsdir> — 獲取指定資料目錄下所有資料的總行數,支援普通文字,TextFile和SequenceFile的壓縮格式,類似於linux下的wc -l