Hive中的四種表型別

2021-09-02 19:14:35 字數 2561 閱讀 9326

內部表,就是一般的表,前面講到的表都是內布標,當表定義被刪除的時候,表中的資料隨之一併被刪除。

外部表,資料存在與否和表的定義互不約束,僅僅只是表對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加上分割槽欄位就可以了,

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='2018-12-07');
分割槽的一些操作:

查詢分割槽中的資料:select * from tblname where dt='2018-12-07';(分割槽相當於where的乙個條件)

手動建立乙個分割槽:alter table tblname add partition(dt='2018-12-07');

檢視分割槽表有哪些分割槽:show partitions tblname;

刪除乙個分割槽(資料一起刪掉了):alter table tblname drop partition(dt='2018-12-07');

多個分割槽如何建立?和單個分割槽類似

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='2018', 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'。

Hive 中的四種排序

1 order by 可以指定desc 降序 asc 公升序 order by會對輸入做全域性排序,因此只有乙個reducer 多個reducer無法保證全域性有序 然而只有乙個reducer,會導致當輸入規模較大時,消耗較長的計算時間。create table temperature year i...

Hive 中的四種排序 舉例

1 order by 可以指定desc 降序 asc 公升序 order by會對輸入做全域性排序,因此只有乙個reducer 多個reducer無法保證全域性有序 然而只有乙個reducer,會導致當輸入規模較大時,消耗較長的計算時間。create table temperature year i...

hive中四種排序的區別

hive中有四種排序,分別是 order by,sort by,distribute by 重點 cluster by order by 全域性排序,但是只能有乙個reduce來處理,在嚴格模式下必須指定limit,否則會報錯,在資料量很大的時候,處理時間會很長甚至跑不出資料,慎用!sort by ...