Hive 中內部表 外部表,分割槽表,分桶表

2021-09-03 07:02:28 字數 3477 閱讀 3713

1.內部表/外部表

管理表(內錶,也叫託管表),外部表(外表):建表時,有external關鍵字的就是外部表。在drop table時,外表的資料是不會被刪除的,內錶的資料會被刪除,但兩者對應的元資料(metadata)是都會被刪除的

如果資料只是給hive用,那麼建議建立內錶

如果資料還可能會給hive以外的程式使用,或者資料本身就是hive以外的程式建立的,hive只是共享使用,對於這兩種場景則建議建立外表

區別:內部表資料由hive自身管理,外部表資料由hdfs管理;

內部表資料儲存的位置hive.metastore.warehouse.dir(預設:/user/hive/warehouse),外部表資料的儲存位置由自己制定;

刪除內部表會直接刪除元資料(metadata)及儲存資料;刪除外部表僅僅會刪除元資料,hdfs上的檔案並不會被刪除;

對內部表的修改會將修改直接同步給元資料,而對外部表的表結構和分割槽進行修改,則需要修復(msck repair table table_name;)

外表可以指定路徑:

create external table demo (

id int,

name string,

salary double

)row format delimited

fields terminated by 『\t』

location 『/user/wangliming/hive/user_info』;

2.分割槽表與動態分割槽

hive在查詢時通常是做全表掃瞄的,而乙個好的分割槽設計可以避免全表掃瞄並且可以大大減少hive的掃瞄資料量

最常見的分割槽表是按天建立分割槽(當然也有使用時間空間兩個維度進行分割槽的,第乙個分割槽是按天建立的,第二個則按地區建立)

分割槽本質上就是一層目錄

當然,分割槽也不能過多,否則就會大大增加namenode的壓力(hadoop hdfs更適合儲存與處理少量的大檔案而不是大量的小檔案),這時候一般就會結合使用分桶機制

分割槽是一種特殊的列,這種列的值不在資料檔案中,而是通過目錄名稱讀取的,分割槽實際上正對應了hdfs中的目錄

create table access_log (

id int,

name string,

url string

)partitioned by (dt string)

row format delimited

fields terminated by 『\t』 ;

進入hive

use wangliming;

load data local inpath 『/home/wangliming/hive/access_log』 into table access_log partition(dt=『20181106』);

select * from access_log where dt=『20181106』 limit 10; – 標準查詢

檢視某張表有哪些分割槽

show partitions access_log;

動態分割槽(預設關閉,使用靜態分割槽)

set hive.exec.dynamic.partition=true; (必須保證有乙個靜態分割槽。通常第乙個)

set hive.exec.dynamic.partition.mode=nonstrict; (所有分割槽都可以為動態)

3.分桶表(詳盡版)

分割槽不能過多,否則就會大大增加namenode的壓力(hadoop hdfs更適合儲存與處理少量的大檔案而不是大量的小檔案),這時候一般就會結合使用分桶機制

分桶可以使資料均勻分布,避免了建立大量小檔案的情景;提高了查詢效率(尤其是連線查詢map side join);另外分桶表也特別適用於抽樣查詢場景

桶的數量一般對應reducer的數量,因為有時候雖然沒有reducer,但是最終的結果也依然會分桶

分割槽對應的字段實際上是目錄,不會儲存在資料檔案中,但是分桶對應的字段就是實際的資料字段

建立乙個分區分桶表

create tablemb(

uidint,

idint,

namestring,

urlstring)

partitioned by (

dtstring)

clustered by (

uid)

into 3 buckets

row format delimited

fields terminated by 『\t』 ;

以下屬性必須設定為true

set hive.enforce.bucketing=true;

否則,我們需要設定和分桶個數相匹配的reducer數目,如set mapred.reduce.tasks=3,並且查詢的時候需要新增cluster by 子句

退出hive

vi access_log_bucket

10000 1 劉十三

10001 2 張三

10002 3 李四

10003 4 王五

10004 5 趙六

10005 6 小明

10006 7 小紅

10007 8 小強

10008 9 小剛

10009 10 小小

進入hive

use liuhongliang;

load data local inpath 『access_log_bucket』 overwrite into table mb partition (dt=20181107);

insert overwrite table mb

partition(dt=20181106)

select uid, id, name, url

from mb

where dt=20181107;

insert overwrite table mb

partition(dt=20181105)

select uid, id, name, url

from mb

where dt=20181107

cluster by uid;

insert overwrite table mb

partition(dt=20181104)

select uid, id, name, url

from mb

where dt=20181105;

insert overwrite table mb

partition(dt=20181103)

select * from (

select 10010, 1, 『小紅』, 『』

union all

select 10011, 3, 『小強』, 『』

union all

select 10012, 2, 『小明』, 『

)t;

hive中外部表 內部表 分割槽表 分桶表

建立資料庫 create database myhive 選擇資料庫 use myhive 建立外部表 external createexternaltable techer t id string,t name string row format delimited fields terminat...

內部表,外部表,分割槽表

1.未被external修飾的是內部表 managed table 被external修飾的為外部表 external table 2.內部表資料由hive自身管理,外部表資料由hdfs管理。3.內部表資料儲存在hive.metastore.warehouse.dir 預設 user hive wa...

Hive 內部表 外部表 分割槽表 擴充套件命令

create external table if not exists 表名 列名資料型別 comment 本列注釋 comment 表注釋 partitioned by 列名資料型別 comment 本列注釋 clustered by 列名,列名,sorted by 列名 asc desc inf...