Hive表有受控表(內部表)、外部表、分區表、桶表四種。
內部表,就是一般的表,前面講到的表都是內布標,當表定義被刪除的時候,表中的數據隨之一並被刪除。
外部表,數據存在與否和表的定義互不約束,僅僅只是表對hdfs上相應文件的一個引用,當刪除表定義的時候,表中的數據依然存在。
創建外部表,external是外部表的關鍵字,也是和內部表有區別的地方
create external table tblName(colName colType...);
加載數據
alter table tblName set location 'hdfs_absolute_uri';
外部表還可以在創建表的時候指定數據的位置,引用當前位置的數據。
create external table tblName(colName colType...) location 'hdfs_absolute_uri';
內部表和外部表的轉換:
內——>外
alter table tblName set tblproperties('EXTERNAL'='TRUE');
外——>內
alter table tblName set tblproperties('EXTERNAL'='FALSE');
分區表
如何創建一張分區表?只需要在之前的創建表后面使用partition by加上分區字段就可以了,eg.
create table tblName (
id int comment 'ID',
name string comment 'name'
) partitioned by (dt date comment 'create time')
row format delimited
fields terminated by '\t';
如何加載數據?
load data local inpath linux_fs_path into table tblName partition(dt='2015-12-12');
分區的一些操作:
查詢分區中的數據:select * from tblName where dt='2015-12-13';(分區相當於where的一個條件)
手動創建一個分區:alter table tblName add partition(dt='2015-12-13');
查看分區表有哪些分區:show partitions tblName;
刪除一個分區(數據一起刪掉了):alter table tblName drop partition(dt='2015-12-12');
多個分區如何創建?
和單分區表的創建類似:
create table tblName (
id int comment 'ID',
name string comment 'name'
) partitioned by (year int comment 'admission year', school string comment 'school name')
row format delimited
fields terminated by '\t';
同時也可以從hdfs上引用數據:
alter table tblName partition(year='2015', school='crxy') set location hdfs_uri;
注意:
必須得現有分區,必須要使用hdfs絕對路徑。
桶表
桶表是對數據進行哈希取值,然后放到不同文件中存儲。查看每個桶文件中的內容,可以看出是通過對 buckets 取模確定的。
如何創建桶表?
create table tblName_bucket(id int) clustered by (id) into 3 buckets;
說明:
clustered by :按照什么分桶
into x buckets:分成x個桶
如何加載數據?
不能使用load data這種方式,需要從別的表來引用
insert into table tblName_bucket select * from tbl_other;
注意:在插入數據之前需要先設置開啟桶操作,不然插入數據不會設置為桶!
set hive.enforce.bucketing=true;
桶表的主要作用:
數據抽樣
提高某些查詢效率
注意:
需要特別注意的是:clustered by 和 sorted by 不會影響數據的導入,這意味着,用戶必須自己負責數據如何導入,包括數據的分桶和排序。
'set hive.enforce.bucketing = true'可以自動控制上一輪 reduce 的數量從而適配 bucket 的個數,
當然,用戶也可以自主設置 mapred.reduce.tasks 去適配bucket 個數,
推薦使用'set hive.enforce.bucketing = true'。