[TOC]
一宏赘、hql 建表語法格式
hql不區(qū)分大小寫览爵,[]里的屬性是可選屬性置鼻。
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]
二蜓竹、參數(shù)說明
CREATE TABLE
創(chuàng)建一個指定名字的表。如果相同名字的表已經(jīng)存在俱济,則拋出異常;用戶可以用 IF NOT EXISTS 選項來忽略這個異常蛛碌。EXTERNAL
關(guān)鍵字可以讓用戶創(chuàng)建一個外部表,默認是內(nèi)部表蔚携。外部表在建表的必須同時指定一個指向?qū)嶋H數(shù)據(jù)的路徑(LOCATION),Hive 創(chuàng)建內(nèi)部表時酝蜒,會將數(shù)據(jù)移動到數(shù)據(jù)倉庫指向的路徑;若創(chuàng)建外部表亡脑,僅記錄數(shù)據(jù)所在的路徑堕澄,不對數(shù)據(jù)的位置做任何改變霉咨。在刪除表的時候,內(nèi)部表的元數(shù)據(jù)和數(shù)據(jù)會被一起刪除途戒,而外部表只刪除元數(shù)據(jù),不刪除數(shù)據(jù)棺滞。COMMENT
是給表字段或者表內(nèi)容添加注釋說明的。PARTITIONED BY
給表做分區(qū)继准,決定了表是否是分區(qū)表。CLUSTERED BY
對于每一個表(table)或者分區(qū)移必, Hive 可以進一步組織成桶,也就是說桶是更為細粒度的數(shù)據(jù)范圍劃分崔泵,Hive采用對列值哈希秒赤,然后除以桶的個數(shù)求余的方式?jīng)Q定該條記錄存放在哪個桶當中。ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
憎瘸, 這里指定表存儲中列的分隔符,默認是 \001幌甘,這里指定的是逗號分隔符痊项,還可以指定其他列的分隔符。STORED AS SEQUENCEFILE|TEXTFILE|RCFILE
鞍泉,如果文件數(shù)據(jù)是純文本,可以使用 STORED AS TEXTFILE咖驮,如果數(shù)據(jù)需要壓縮,使用 STORED AS SEQUENCEFILE训枢。LOCATION
定義 hive 表的數(shù)據(jù)在 hdfs 上的存儲路徑,一般管理表(內(nèi)部表不不要自定義)恒界,但是如果定義的是外部表,則需要直接指定一個路徑仗处。
三、創(chuàng)建表的三種方式
3.1婆誓、 使用 create 命令
CREATE TABLE `employee`(
`dept_no` int,
`addr` string,
`tel` string)
partitioned by(statis_date string )
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
詳細參考上述建表說明。
可以使用describe formatted employee
查看建表相關(guān)的各種配置屬性以及默認屬性洋幻。
3.2、 create table ...as select..(CTAS)
[AS select_statement] 這個語句是用來通過查詢已有的表來創(chuàng)建一張新表文留,這樣可以根據(jù)已有的表來創(chuàng)建子表,對于數(shù)據(jù)分析和優(yōu)化都是有很大的好處的燥翅。
create table employee1
as
select * from employee where statis_date='20180229';
- 使用查詢創(chuàng)建并填充表骑篙,select 中選取的列名會作為新表的列名(所以通常是要取別名)靶端;
- 會改變表的屬性、結(jié)構(gòu)凛膏,比如只能是內(nèi)部表、分區(qū)分桶也沒了:
- 目標表不允許使用分區(qū)分桶的猖毫,
FAILED: SemanticException [Error 10068]: CREATE-TABLE-AS-SELECT does not support partitioning in the target table
,對于舊表中的分區(qū)字段吁断,如果通過 select * 的方式镊折,新表會把它看作一個新的字段,這里要注意 ; - 目標表不允許使用外部表骂因,如 create external table … as select… 報錯
FAILED: SemanticException [Error 10070]: CREATE-TABLE-AS-SELECT cannot create external table
炎咖; - 創(chuàng)建的表存儲格式會變成默認的格式 TEXTFILE 乘盼。
- 目標表不允許使用分區(qū)分桶的猖毫,
- 可以指定表的存儲格式,行和列的分隔符等俄烁。
3.3、 使用 like 創(chuàng)建相同結(jié)構(gòu)的表
CREATE TABLE LIKE
- 用來復(fù)制表的結(jié)構(gòu)
- 需要外部表的話页屠,通過 create external table like … 指定
- 不填充數(shù)據(jù)