hive 內部表與外部表的區別
按照管理許可權分為:內部表和外部表
區分原理: 真實表資料的管理許可權 是 hive 內部所有 , 還是 hdfs 所有(external table)
hive 預設建立內部表, 若建表指定 external 則建立外部表
兩者之間的區別:兩者使用場景:刪除內部表,刪除表元資料和資料
刪除外部表,只刪除元資料,不刪除實際表中的資料
如果乙份資料僅僅只是使用 hive 做統計分析,則可以使用內部表若資料已儲存在 hdfs, 需使用 hive 去分析, 且該資料還有可能要使用其他的計算引擎去計算,則使用外部表
hive 分桶表與分割槽表
區別簡述: (詳細研究兩表後自然了解)
分割槽表與分桶表之間區別(面試重點):以下是分桶表分割槽表詳解:分割槽:細化資料管理,直接讀對應目錄,縮小mapreduce程式要掃瞄的資料量
分桶:1、提高join查詢的效率(用分桶字段做連線字段)
2、提高取樣的效率
分割槽表(partition): 根據某些字段進行分割槽操作 注意: hdfs 不支援過多的子目錄, 也給分割槽的使用帶來了限制
建立分割槽表,即在建立表時加入一句話.注意:這裡分割槽字段不能與表中字段重複
partitioned by (pt_d string)
向分割槽中載入資料
load data local inpath '/home/hadoop/desktop/data' overwrite into table t1 partition ( pt_d =
'000000');
檢視分割槽
show partitions table_name;
新增乙個分割槽
alter table t1 add partition (pt_d = 『000000』)
;新增多個分割槽
正確寫法: alter table testljb add partition(age=1,***=
'male');
正確寫法: alter table testljb add partition(age=3) partition(age=4)
;錯誤寫法: alter table testljb add partition(age=5,age=6)
; 理解: 對相同分割槽字段進行新增時,只隨機新增乙個分割槽;
想要對相同字段進行新增時, 只能寫兩次partition
對不同分割槽字段可以在同乙個partition語法中新增
刪除分割槽: 對於外部表的drop partition不會刪除hdfs上的檔案
alter table t1 drop partition(pt_d = 『000000』)
;修復分割槽:
對內部表的修改會將修改直接同步給元資料,而對外部表的表結構和分割槽進行修改,則需要修復
msck repair table table_name;
分桶表(bucket):知乎大佬資料, 就兩字概括, 清晰!
桶的概念就是mapreduce的分割槽的概念,兩者完全相同。物理上每個桶就是目錄裡的乙個檔案,乙個作業產生的桶(輸出檔案)數量和reduce任務個數相同
查詢表的詳細資訊
desc formatted table_name;
建立分桶表有三種方式:
直接建表
create table like
create table as select ,單值分割槽表不能用 create table as select 建表
直接建表語法:
create [external] table
([,
...])]
[partitioned by ...]
clustered by (
)[sorted by (
[asc|desc]
[, [asc|desc]
...])]
into buckets
[row format
][stored as textfile|orc|csvfile]
[location ''
][tblproperties (''=
'', ...)];
解釋: clustered by (
): 以哪一列進行分桶
sorted by (
[asc|desc]: 對分桶內的資料進行排序
into buckets: 分成幾個桶
匯入資料:
因為分桶表在建立的時候只會定義scheme,且寫入資料的時候不會自動進行分桶、排序,
所以需要人工先進行分桶、排序後再寫入資料。確保目標表中的資料和它定義的分布一致。
目前有兩種方式往分桶表中插入資料:
方法一:開啟enforce bucketing開關
set hive.enforce.bucketing=true;
insert (into|overwrite) table select
[sort by
[asc|desc], [
[asc|desc], ...]];
方法二:將reducer個數設定為目標表的桶數,並在 select 語句中用 distribute by 對查詢結果按目標表的分桶鍵分進reducer中。
set mapred.reduce.tasks =
; insert (into|overwrite) table
select
distribute by , [
, ...]
[sort by
[asc|desc], [
[asc|desc], ...]];
如果分桶表建立時定義了排序鍵,那麼資料不僅要分桶,還要排序
如果分桶鍵和排序鍵不同,且按降序排列,使用distribute by … sort by分桶排序
如果分桶鍵和排序鍵相同,且按公升序排列(預設),使用 cluster by 分桶排序,即如下:
set mapred.reduce.tasks =
; insert (into|overwrite) table
select
cluster by , [
, ...]
;至此匯入資料完成;
分桶表使抽樣更加高效
抽樣語法 :tablesample(bucket x out of y)
y必須是table總共bucket數的倍數或者因子。hive根據y的大小,決定抽樣的比例。
例如:table總共分了64份,
當y=32時,抽取2(也就是64/32)個bucket的資料,
當y=128時,抽取1/2(也就是64/128)個bucket的資料。
x表示從哪個bucket開始抽取。
例如:table總共bucket數為32,
tablesample(bucket 3 out of 16)表示總共抽取2(也就是32/16)個bucket的資料,
分別為第三個bucket和第19(3+16)個bucket的資料。
hive建立不同的表(內部,外部,分割槽,分桶)
hive本身並不儲存資料,而是將資料儲存在hadoop的hdfs中,表名對應hdfs中的目錄 檔案。根據資料的不同儲存方式,將hive表分為外部表 內部表 分割槽表和分桶表四種資料模型。每種資料模型各有優缺點。通過create user命令建立user表時,會在hdfs中生成乙個user目錄 檔案。...
Hive(二) 分區分桶,內部表外部表
hive是hadoop生態圈中實現資料倉儲的一項技術。雖然hadoop和hdfs的設計侷限了hive所能勝任的工作,但是hive仍然是目前網際網路中最適合資料蒼鷺的應用技術。不論從 品相還是舉止 hive都像乙個關係型資料庫。使用者對資料庫 表和列這類術語比較熟悉的話,那麼掌握hive的查詢語言hq...
hive建立分區分桶表
在hive中要建立分割槽表的語句為 partition create table rating table p userid string,movieid string,rating string partitioned by dt string row format delimited field...