hive查看一张表的分区字段_Hive表分区与索引
hive表分區(qū)
表分區(qū)是指將數(shù)據(jù)按照物理分層的方式進(jìn)行區(qū)分開,加快查詢的速度,同時也起到數(shù)據(jù)快照的作用!
創(chuàng)建分區(qū)表的關(guān)鍵字:partitioned by ,可以指定單個字段也可以指定多個字段;
partitioned by (dt String,country string);
create table pt_test(ts bigint,line string)
partitioned by (dt String,country string);
往分區(qū)表插入數(shù)據(jù):
load data local inpath '/root/hive/partitions/file1' into table pt_test partition (dt='2001-01-01',country='GB’);
動態(tài)分區(qū)不能使用load加載數(shù)據(jù),需要使用insert into
hive靜態(tài)分區(qū)和動態(tài)分區(qū)
hive支持兩種類型的分區(qū):靜態(tài)分區(qū)和動態(tài)分區(qū)
靜態(tài)分區(qū)與動態(tài)分區(qū)的主要區(qū)別在于靜態(tài)分區(qū)是手動指定,而動態(tài)分區(qū)是通過數(shù)據(jù)來進(jìn)行判斷。詳細(xì)來說,靜態(tài)分區(qū)的列實在編譯時期,通過用戶傳遞來決定的;動態(tài)分區(qū)只有在 SQL 執(zhí)行時才能決定
默認(rèn)創(chuàng)建的分區(qū)是靜態(tài)分區(qū),如果要指定動態(tài)分區(qū)可以通過以下配置:
查看表分區(qū):
show partitions tbl;
如果要配置動態(tài)分區(qū)修改以下兩個配置:
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
hive分桶
當(dāng)單個分區(qū)或者表中的數(shù)據(jù)量越來越大,當(dāng)分區(qū)不能更細(xì)粒的劃分?jǐn)?shù)據(jù)時,采用分桶技術(shù)將數(shù)據(jù)更細(xì)粒度的劃分和管理。
分桶關(guān)鍵字:BUCKET
指定分桶的字段:clustered by (uid)
創(chuàng)建一個分桶表:
create table if not exists bucket(
uid int,
uname string,
uage int
)
clustered by (uid) into 4 buckets
row format delimited
fields terminated by ‘,’
加載數(shù)據(jù):
load data local inpath '/usr/local/hive/test/3.txt' into table buc1 ;
分桶查詢測試:
select * from buc1 cluster by (uid) ;
分桶表的查詢:
查詢?nèi)?/p>
select * from buc3;
select * from buc3 tablesample(bucket 1 out of 1)
查詢第幾個桶數(shù)據(jù)
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:查詢的總桶數(shù),y可以是總的桶數(shù)的倍數(shù)或者因子;x不能大于y
分區(qū)與分桶:
1、分區(qū)使用的是表外字段,分桶使用的是表內(nèi)字段
2、分桶是更細(xì)粒度的劃分、管理數(shù)據(jù),更多用來做數(shù)據(jù)抽樣、JOIN操作
3、分區(qū)是粗粒度的將數(shù)據(jù)隔離,分桶是更加細(xì)粒度的將數(shù)據(jù)隔離
hive視圖
1、視圖是一個虛表,一個邏輯概念,可以概括出多張數(shù)據(jù)表
表是物理概念,數(shù)據(jù)放在表中,視圖是虛表,操作視圖和操作表是一樣的,只不過視圖下面不存儲具體的數(shù)據(jù)
視圖在創(chuàng)建時候,只是保存了一份元數(shù)據(jù),當(dāng)查詢視圖的時候,才開始執(zhí)行視圖對應(yīng)的 那些子查詢
2、視圖是建立在已有表的基礎(chǔ)上,視圖賴以建立的這些表稱為基表
3、視圖可以簡化復(fù)雜的查詢
4、視圖只能查詢,不能 Load/Insert/Update/Delete 數(shù)據(jù);
create view 視圖表名 as select 基表1.字段1,基表1.字段2,基表2.字段1 ...... from 庫名1.表名 庫名2.表名 where 基表1.字段=基表2.字段
在mysql或者oracle中,視圖是具體的存儲數(shù)據(jù)的,一般稱之為物化,物化之后對于一些復(fù)雜的查詢查詢可以提升效率
視圖是只讀的,只允許修改元數(shù)據(jù)中的tblproperties屬性信息
hive視圖的一些查詢語句:
show views;
desc view_cdt;
查詢視圖
select * from view ;
刪除視圖:
drop view view_cdt;
hive索引
Hive從0.7.0版本開始加入了索引,目的是提高Hive表指定列的查詢速度。沒有索引的時候,Hive在執(zhí)行查詢時需要加載整個表或者整個分區(qū),然后處理所有的數(shù)據(jù),但當(dāng)在指定列上存在索引,再通過指定列查詢時,那么只會加載和處理部分文件
索引是一種以空間換取時間的方式
hive索引的原理:
Hive的索引其實是一張索引表(Hive的物理表),在表里面存儲索引列的值,該值對應(yīng)的HDFS的文件路徑,該值在數(shù)據(jù)文件中的偏移量。
當(dāng)Hive通過索引列執(zhí)行查詢時,首先通過一個MR Job去查詢索引表,根據(jù)索引列的過濾條件,查詢出該索引列值對應(yīng)的HDFS文件目錄及偏移量,并且把這些數(shù)據(jù)輸出到HDFS的一個文件中,然后再根據(jù)這個文件中去篩選原文件,作為查詢Job的輸入。
hive索引的好處:
可以避免全表掃描和資源浪費
可以加快含有g(shù)roup by的語句的查詢速度
hive索引的語法
創(chuàng)建索引,未加載數(shù)據(jù)
create index test_index on table test(id)
as 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler'
with deferred rebuild
in table test;
生成索引數(shù)據(jù)
alter index test_index on test rebuild;
hive索引的一些缺點:
使用過程繁瑣
需要額外的Job去掃描表,時間較長
數(shù)據(jù)更新,索引不會自動更新,需要手動進(jìn)行更新
希望本文對你有幫助!
感謝關(guān)注“碼農(nóng)星球”。本文版權(quán)屬于“碼農(nóng)星球”。我們提供咨詢和培訓(xùn)服務(wù),關(guān)于本文有任何困惑,請關(guān)注并聯(lián)系我們。
總結(jié)
以上是生活随笔為你收集整理的hive查看一张表的分区字段_Hive表分区与索引的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html语言无序下拉菜单,(4条消息)H
- 下一篇: PHP独立ip统计,通过nginx日志统