1.建表語法
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] [TBLPROPERTIES (property_name=property_value, ...)] [AS select_statement]
2.字段解釋說明
(1)CREATE TABLE 創建一個指定名字的表。如果相同名字的表已經存在,則拋出異常;用戶可以用 IF NOT EXISTS 選項來忽略這個異常。
(2)EXTERNAL關鍵字可以讓用戶創建一個外部表,在建表的同時可以指定一個指向實際數據的路徑(LOCATION),在刪除表的時候,內部表的元數據和數據會被一起刪除,而外部表只刪除元數據,不刪除數據。
(3)COMMENT:為表和列添加注釋。
(4)PARTITIONED BY創建分區表
(5)CLUSTERED BY創建分桶表
(6)SORTED BY不常用,對桶中的一個或多個列另外排序
(7)ROW FORMAT
DELIMITED [FIELDS TERMINATED BY char] [COLLECTION ITEMS TERMINATED BY char] [MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char] | SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, ...)]
用戶在建表的時候可以自定義SerDe或者使用自帶的SerDe。如果沒有指定ROW FORMAT 或者ROW FORMAT DELIMITED,將會使用自帶的SerDe。在建表的時候,用戶還需要為表指定列,用戶在指定表的列的同時也會指定自定義的SerDe,Hive通過SerDe確定表的具體的列的數據。
SerDe是Serialize/Deserilize的簡稱, hive使用Serde進行行對象的序列與反序列化。
(8)STORED AS指定存儲文件類型
常用的存儲文件類型:SEQUENCEFILE(二進制序列文件)、TEXTFILE(文本)、RCFILE(列式存儲格式文件)
如果文件數據是純文本,可以使用STORED AS TEXTFILE。如果數據需要壓縮,使用 STORED AS SEQUENCEFILE。
(9)LOCATION :指定表在HDFS上的存儲位置。
(10)AS:后跟查詢語句,根據查詢結果創建表。
(11)LIKE允許用戶復制現有的表結構,但是不復制數據。
管理表
1.理論
默認創建的表都是所謂的管理表,有時也被稱為內部表。因為這種表,Hive會(或多或少地)控制着數據的生命周期。Hive默認情況下會將這些表的數據存儲在由配置項hive.metastore.warehouse.dir(例如,/user/hive/warehouse)所定義的目錄的子目錄下。 當我們刪除一個管理表時,Hive也會刪除這個表中數據。管理表不適合和其他工具共享數據。
2.案例實操
(1)普通創建表
create table if not exists student2( id int, name string ) row format delimited fields terminated by '\t' stored as textfile location '/user/hive/warehouse/student2';
(2)根據查詢結果創建表(查詢的結果會添加到新創建的表中)
create table if not exists student3 as select id, name from student;
(3)根據已經存在的表結構創建表
create table if not exists student4 like student;
(4)查詢表的類型
hive (default)> desc formatted student2; Table Type: MANAGED_TABLE
外部表
1.理論
因為表是外部表,所以Hive並非認為其完全擁有這份數據。刪除該表並不會刪除掉這份數據,不過描述表的元數據信息會被刪除掉。
2.管理表和外部表的使用場景
每天將收集到的網站日志定期流入HDFS文本文件。在外部表(原始日志表)的基礎上做大量的統計分析,用到的中間表、結果表使用內部表存儲,數據通過SELECT+INSERT進入內部表。
3.案例實操
分別創建部門和員工外部表,並向表中導入數據。
(1) 上傳數據到HDFS
hive (default)> dfs -mkdir /student; hive (default)> dfs -put /opt/module/datas/student.txt /student;
(2)建表語句
hive (default)> create external table stu ( id int, name string) row format delimited fields terminated by '\t' location '/student';
(3)查看創建的表
hive (default)> select * from stu_external; OK stu_external.id stu_external.name 1001 lisi 1002 wangwu 1003 zhaoliu
(4)查看表格式化數據
hive (default)> desc formatted dept; Table Type: EXTERNAL_TABLE
(5)刪除外部表
hive (default)> drop table stu_external;
外部表刪除后,hdfs中的數據還在,但是metadata中stu_external的元數據已被刪除
管理表與外部表的互相轉換
(1)查詢表的類型
hive (default)> desc formatted student2; Table Type: MANAGED_TABLE
(2)修改內部表student2為外部表
alter table student2 set tblproperties('EXTERNAL'='TRUE');
(3)查詢表的類型
hive (default)> desc formatted student2; Table Type: EXTERNAL_TABLE
(4)修改外部表student2為內部表
alter table student2 set tblproperties('EXTERNAL'='FALSE');
(5)查詢表的類型
hive (default)> desc formatted student2; Table Type: MANAGED_TABLE
注意:('EXTERNAL'='TRUE')和('EXTERNAL'='FALSE')為固定寫法,區分大小寫!