Hive 內部外部分區分桶 表詳解 區別

2021-09-29 09:10:37 字數 3839 閱讀 7051

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