hive建表的標準格式及其建表屬性詳解1
Hive建表是學習使用hive的第一步,然後才能基於表對hive資料倉庫進行操作。學習建表前,首先要知道hive表的構建屬性 ,知道哪些屬性是固定的,哪些屬性是可以定製的等等。
一.標準hql建表語法格式
1.官方標準語法:(hql不區分大小寫,下面[]裡的屬性是可選屬性)
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_name data_type [COMMENT col_comment], ...)] [COMMENT table_comment] [PARTITIONED BY(col_name data_type [COMMENT col_comment], ...)] [CLUSTERED BY (col_name, col_name, ...) [SORTED BY(col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS] [ROW FORMAT row_format] [STORED AS file_format] [LOCATION hdfs_path]
二.標準建表語法各項引數說明
1.CREATE TABLE 建立一個指定名字的表。如果相同名字的表已經存在,則丟擲異常;使用者可以用 IF NOT EXISTS 選項來忽略這個異常,一般也可以不加這個IF NOT EXISTS語句,最多丟擲錯誤。
2.EXTERNAL關鍵字可以讓使用者建立一個外部表,預設是內部表,外部表在建表的必須同時指定一個指向實際資料的路徑(LOCATION),Hive 建立內部表時,會將資料移動到資料倉庫指向的路徑;若建立外部表,僅記錄資料所在的路徑,不對資料的位置做任何改變。在刪除表的時候,內部表的元資料和資料會被一起刪除,而外部表只刪除元資料,不刪除資料。
3.COMMENT 後面跟的字串是給表字段或者表內容添加註釋說明的,雖然它對於表之間的計算沒有影響,但是為了後期的維護,所以實際開發都是必須要加COMMENT的。
4. PARTITIONED BY其實是給表做分割槽,決定了表是否是分割槽表。Hive中所謂分割槽表就是將表裡新增加一個欄位,就是分割槽的名字,這樣你在操作表中的資料時,可以按分割槽欄位進行過濾。具體分割槽解釋後面部落格有說明。
5.[ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ] 這裡指定表儲存中國列的劃分格式,預設是\001,這裡指定的是逗號分隔符,還可以指定其他列的分隔符,看實際需求
6.STORED AS SEQUENCEFILE|TEXTFILE|RCFILE如果檔案資料是純文字,可以使用 STORED AS TEXTFILE。如果資料需要壓縮,使用 STORED AS SEQUENCEFILE。這裡主要牽涉到hive儲存的三種檔案格式,具體區別參考後續部落格。
7.CLUSTERED BY對於每一個表(table)或者分割槽, Hive可以進一步組織成桶,也就是說桶是更為細粒度的資料範圍劃分。Hive也針對某一列進行桶的組織。Hive採用對列值雜湊,然後除以桶的個數求餘的方式決定該條記錄存放在哪個桶當中
8.LOCATION 其實是定義hive表的資料在hdfs上的儲存路徑,一般管理表(內部表不不要自定義),但是如果定義的是外部表,則需要直接指定一個路徑。實際上不指定也沒事,會使用預設路徑
總結:實際建表可能會對檔案的行列分隔符要求自定義,檔案的儲存方式有所要求 ,表的分割槽要求是自動分割槽,表的儲存位置要放到指定路徑下等等各種不確定需求,建立的表也是定製化的五花八門,但是核心都在這些基礎的建表標準語法裡進行變動,變動不同模組實現不同需求。
二.Hive基於上面標準建表語法的演示
1.建立一個列分隔符為‘,’的表,預設內部表
create table if not exists track(
id int comment'id',
ipname string comment'ip名稱',
zart decimal(10,5) comment'測試小數')
partitioned by (date string,hour string)
row format delimited fields terminated by '\t';
2.使用desc可以,查看錶結構,使用describe formatted 可以查看錶的詳細結構,使用show create talbe可以檢視建表語句。
1.檢視基礎表結構
hive (fdm_sor)> desc track;
OK
col_name data_type comment
id int id
ipname string ip??
zart decimal(10,5) ????
date string
hour string
# Partition Information
# col_name data_type comment
date string
hour string
====================================================================================
2.檢視詳細的表結構資訊
hive (fdm_sor)> describe formatted track;
OK
col_name data_type comment
# col_name data_type comment
id int id
ipname string ip??
zart decimal(10,5) ????
# Partition Information
# col_name data_type comment
date string
hour string
# Detailed Table Information
Database: fdm_sor
Owner: robot
CreateTime: Mon Dec 31 00:23:26 CST 2018
LastAccessTime: UNKNOWN
Protect Mode: None
Retention: 0
Location: hdfs://hadoop102:9000/user/hive/warehouse/fdm_sor.db/track
Table Type: MANAGED_TABLE
Table Parameters:
transient_lastDdlTime 1546187006
# Storage Information
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
====================================================================================
3.檢視建表語句,實際很常用的命令
hive (fdm_sor)> show create table track;
OK
createtab_stmt
CREATE TABLE `track`(
`id` int COMMENT 'id',
`ipname` string COMMENT 'ip??',
`zart` decimal(10,5) COMMENT '????')
PARTITIONED BY (
`date` string,
`hour` string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
'hdfs://hadoop102:9000/user/hive/warehouse/fdm_sor.db/track'
TBLPROPERTIES (
'transient_lastDdlTime'='1546187006')
Time taken: 0.033 seconds, Fetched: 17 row(s)
hive (fdm_sor)>
3.關於建立分割槽表,實際開發中對於表的各種定製,如分割槽,儲存格式,路徑,內部表,外部表,以及實際開發中表的使用方式與注意事項,請參考後面部落格