分割槽針對的是資料的儲存路徑;分桶針對的是資料檔案
(對已經分好類的檔案匯入靜態分割槽)
create table tb_p_order(
oid int ,
dt string ,
cost double
)partitioned by (mot string,day string)
row format delimited fields terminated by "," ;
例項:建立乙個二級靜態分割槽
匯入資料:
load data local inpath "/opt2/06-18.txt" into table tb_p_order partition(mot='06',day='18');
06-18.txt
01,2020-06-18,200檢視效果:分到不同的資料夾下管理,二級分割槽就是二級資料夾,通過分割槽字段檢查查詢時間02,2020-06-18,200
03,2020-06-18,100
03,2020-06-18,200
04,2020-06-18,200
05,2020-06-18,20
06,2020-06-18,100
07,2020-06-18,200
08,2020-06-18,200
09,2020-06-18,100
10,2020-06-18,200
根據查詢的已存在hive中的資料的某個屬性進行分割槽 ,就是動態分割槽。查詢後動態匯入建好的分割槽表
1,開啟動態分割槽功能:
set hive.exec.dynamic.partition=true ;
set hive.exec.dynamic.partition.mode=nonstrick; 可以從普通表中匯入資料
2,建立分割槽表:(和普通分割槽表建立沒區別)
create table if not exists tb_p_user(
uid string ,
name string ,
age int ,
gender string ,
address string
)partitioned by (addr string)
row format delimited fields terminated by " " ;
3,動態的從其他表中匯入資料
插入資料的時候兩張表字段型別個數一一對應。 最後乙個字段就是分割槽字段 (其中tb_user就是普通表)
insert into tb_p_user partition(addr)
select uid , name , age , gender , address , address from tb_user ;
4,動態分割槽相關的設定引數
set hive.exec.dynamic.partition=true //使用動態分割槽
set hive.exec.dynamic.partition.mode=nonstrick;//無限制模式,如果模式是strict,則必須有乙個靜態分割槽且放在最前面
set hive.exec.max.dynamic.partitions.pernode=10000;//每個節點生成動態分割槽的最大個數
set hive.exec.max.dynamic.partitions=100000;//生成動態分割槽的最大個數
set hive.exec.max.created.files=150000;//乙個任務最多可以建立的檔案數目
set dfs.datanode.max.xcievers=8192;//限定一次最多開啟的檔案數
set hive.merge.mapfiles=true; //map端的結果進行合併
set mapred.reduce.tasks =20000; //設定reduce task個數
好處:1,更快,桶為表加上額外結構,連線相同列劃分了桶的表,可以使用map-side join更加高效。(相當於mr的分割槽)
2,取樣sampling更高效。沒有分割槽的話需要掃瞄整個資料集。
建立分桶表:
1,開啟分桶
set hive.enforce.bucketing=true;
2,建立分桶表,例項根據id分桶,分成四份
create table buck_demo(id int, name string)
clustered by(id) into 4 buckets;
3,測試,動態的從其他表中匯入資料
insert into table buck_demo
select id, name from stu;
4,檢視結果:匯入的資料被分成四份
5,抽樣資料:示例:拿出其中第二份
select * from buck_demo tablesample(bucket 2 out of 4 on id);
注:tablesample是抽樣語句,語法:tablesample(bucket x out of y) 。
y必須是table總bucket數的倍數或者因子。hive根據y的大小,決定抽樣的比例。例如,table總共分了4份,當y=2時,抽取(4/2=)2個bucket的資料,當y=8時,抽取(4/8=)1/2個bucket的資料。
x表示從哪個bucket開始抽取,如果需要取多個分割槽,以後的分割槽號為當前分割槽號加上y。例如,table總bucket數為4,tablesample(bucket 1 out of 2),表示總共抽取(4/2=)2個bucket的資料,抽取第1(x)個和第3(x+y)個bucket的資料。
hive表型別 桶表 分割槽表
hive表型別 桶表 桶表是對資料進行雜湊取值,然後放到不同檔案中儲存。建立表create table t bucket id string clustered by id into 3 buckets 載入資料 set hive.enforce.bucketing true insert into...
HIVE 表 分割槽表 分桶表
hive中表 1.managed table 託管表。刪除表時,資料也刪除了。2.external table 外部表。刪除表時,資料不刪。hive命令 建立表,external 外部表 hive create external table if not exists t2 id int,name ...
hive 動態分割槽表
注意 1 並不是都要建輔助表,因為是用load的方式載入資料,所以才要建 2 select 的時候,分割槽欄位要寫在最後面 使用動態分割槽表必須配置的引數 設定為true允許使用dynamic partition hive.exec.dynamic.partition 預設false 設定dynam...