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 查詢...