1. 程式人生 > >獲取hive建表語句

獲取hive建表語句

在使用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表建立表的過程已經比較清楚了

  1. 解析使用者提交hive語句,對其進行解析,分解為表、欄位、分割槽等hive物件
  2. 根據解析到的資訊構建對應的表、欄位、分割槽等物件,從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