hive檢視一張表的分割槽字段 Hive表分割槽與索引

2021-10-12 15:20:53 字數 3230 閱讀 5594

hive表分割槽

表分割槽是指將資料按照物理分層的方式進行區分開,加快查詢的速度,同時也起到資料快照的作用!

建立分割槽表的關鍵字:partitioned by ,可以指定單個欄位也可以指定多個字段;

partitioned by (dt string,country string);

create table pt_test(ts bigint,line string)

partitioned by (dt string,country string);

往分割槽表插入資料:

load data local inpath '/root/hive/partitions/file1' into table pt_test partition (dt='2001-01-01',country='gb』);

動態分割槽不能使用load載入資料,需要使用insert into

hive靜態分割槽和動態分割槽

hive支援兩種型別的分割槽:靜態分割槽和動態分割槽

靜態分割槽與動態分割槽的主要區別在於靜態分割槽是手動指定,而動態分割槽是通過資料來進行判斷。詳細來說,靜態分割槽的列實在編譯時期,通過使用者傳遞來決定的;動態分割槽只有在 sql 執行時才能決定

預設建立的分割槽是靜態分割槽,如果要指定動態分割槽可以通過以下配置:

檢視表分割槽:

show partitions tbl;

如果要配置動態分割槽修改以下兩個配置:

set hive.exec.dynamic.partition=true;

set hive.exec.dynamic.partition.mode=nonstrict;

hive分桶

當單個分割槽或者表中的資料量越來越大,當分割槽不能更細粒的劃分資料時,採用分桶技術將資料更細粒度的劃分和管理。

分桶關鍵字:bucket

指定分桶的字段:clustered by (uid)

建立乙個分桶表:

create table if not exists bucket(

uid int,

uname string,

uage int

clustered by (uid) into 4 buckets

row format delimited

fields terminated by 『,』

載入資料:

load data local inpath '/usr/local/hive/test/3.txt' into table buc1 ;

分桶查詢測試:

select * from buc1 cluster by (uid) ;

分桶表的查詢:

查詢全部

select * from buc3;

select * from buc3 tablesample(bucket 1 out of 1)

查詢第幾個桶資料

select * from buc3 tablesample(bucket 1 out of 4 on uid); //除4餘0

select * from buc3 tablesample(bucket 1 out of 2 on uid);

tablesample(bucket x out of y on uid)

x:代表從第幾桶開始查詢

y:查詢的總桶數,y可以是總的桶數的倍數或者因子;x不能大於y

分割槽與分桶:

1、分割槽使用的是表外字段,分桶使用的是表內字段

2、分桶是更細粒度的劃分、管理資料,更多用來做資料抽樣、join操作

3、分割槽是粗粒度的將資料隔離,分桶是更加細粒度的將資料隔離

hive檢視

1、檢視是乙個虛表,乙個邏輯概念,可以概括出多張資料表

表是物理概念,資料放在表中,檢視是虛表,操作檢視和操作表是一樣的,只不過檢視下面不儲存具體的資料

檢視在建立時候,只是儲存了乙份元資料,當查詢檢視的時候,才開始執行檢視對應的 那些子查詢

2、檢視是建立在已有表的基礎上,檢視賴以建立的這些表稱為基表

3、檢視可以簡化複雜的查詢

4、檢視只能查詢,不能 load/insert/update/delete 資料;

create view 檢視表名 as select 基表1.欄位1,基表1.欄位2,基表2.欄位1 ...... from 庫名1.表名 庫名2.表名 where 基表1.欄位=基表2.欄位

在mysql或者oracle中,檢視是具體的儲存資料的,一般稱之為物化,物化之後對於一些複雜的查詢查詢可以提公升效率

檢視是唯讀的,只允許修改元資料中的tblproperties屬性資訊

hive檢視的一些查詢語句:

show views;

desc view_cdt;

查詢檢視

select * from view ;

刪除檢視:

drop view view_cdt;

hive索引

hive從0.7.0版本開始加入了索引,目的是提高hive表指定列的查詢速度。沒有索引的時候,hive在執行查詢時需要載入整個表或者整個分割槽,然後處理所有的資料,但當在指定列上存在索引,再通過指定列查詢時,那麼只會載入和處理部分檔案

索引是一種以空間換取時間的方式

hive索引的原理:

hive的索引其實是一張索引表(hive的物理表),在表裡面儲存索引列的值,該值對應的hdfs的檔案路徑,該值在資料檔案中的偏移量。

當hive通過索引列執行查詢時,首先通過乙個mr job去查詢索引表,根據索引列的過濾條件,查詢出該索引列值對應的hdfs檔案目錄及偏移量,並且把這些資料輸出到hdfs的乙個檔案中,然後再根據這個檔案中去篩選原檔案,作為查詢job的輸入。

hive索引的好處:

可以避免全表掃瞄和資源浪費

可以加快含有group by的語句的查詢速度

hive索引的語法

建立索引,未載入資料

create index test_index on table test(id)

as 'org.apache.hadoop.hive.ql.index.compact.compactindexhandler'

with deferred rebuild

in table test;

生成索引資料

alter index test_index on test rebuild;

hive索引的一些缺點:

使用過程繁瑣

需要額外的job去掃瞄表,時間較長

資料更新,索引不會自動更新,需要手動進行更新

希望本文對你有幫助!

Oracle一張表的多個字段更新到另一張表中去

假設表a中有多個字段 province city 需要從b表獲取 兩張表的mobile一樣 總結了幾種寫法。一 update a set a.province select province from b where b.mobile a.mobile update a set a.city sel...

sql 插入一張表的部分字段需要查詢另一張表

insert into 表a 欄位a,欄位b,欄位c select 欄位a 欄位b 欄位c from 表bwhere 條件insert into 表a 欄位a,欄位b,欄位c,欄位d select 欄位a 要插入的值 例 inserttest 不為在表b查詢到的值 用 包起來表示字串,方法,數值不用...

oracle中一張表的某個欄位與另一張表關聯

今天在無意間查詢到乙個sql,有兩張表,一張使用者表,使用者表中有個personroles欄位,clob型別,裡面是逗號分隔的角色id a,b,c,d 需要查詢每個人和其現有的角色。問題在於使用者表和角色表的關聯,直接left join用roles.id in user.personroles 查詢...