在使用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
從上面兩張表的內容來看,hive表建立表的過程已經比較清楚了
解析使用者提交hive語句,對其進行解析,分解為表、字段、分割槽等hive物件
根據解析到的資訊構建對應的表、字段、分割槽等物件,從sequence_table中獲取構建物件的最新id,與構建物件資訊(名稱,型別等)一同通過dao方法寫入到元資料表中去,成功後將sequence_table中對應的最新id+5。
實際上我們常見的rdbms都是通過這種方法進行組織的,典型的如postgresql,其系統表中和hive元資料一樣裸露了這些id資訊(oid,cid等),而oracle等商業化的系統則隱藏了這些具體的id。
有了上面的資訊,再想獲得hive的建表語句已經是易如反掌了,這裡提供乙個已經開發好的指令碼,使用shell開發,大家可以自由修改。注意:其中mysql連線資訊請根據實際環境進行配置。
使用方法如下:
如果需要多天分割槽ddl還可以這樣用(前提是分割槽中含有日期資訊,如pt=20100720):
hivesql synctab和hivesql sql一樣支援上述日期限定功能。
此外,還提供了兩個附加的功能(也很有用呃)
**:
Hive學習筆記10 元資料解析
hive元資料不存放在hdfs上,而是存放在rdbms上,典型的如mysql derby等。use hive 使用 hive 資料庫庫 show tables mysql show tables tables in hive bucketing cols cds columns v2 databas...
Hive解析json格式資料
本文將介紹兩個使用hive解析json的小demo 1.hadoop hadoop001 jsondata more rating.json 很多資料.hive hwzhdb create table parsejson jsondata string oktime taken 0.146 seco...
HIVE解析json格式資料
id conditions 312 313 第一步 我們可以看到conditions欄位下的json格式資料,是json串裡面套著類似於list結構,我們先取出。get json object conditions,diyitems 取出之後資料是這樣的 第二步 我們把list結構中每個元素拿出來形...