Hive動態分區和分桶

1、Hive動態分區

1.1、hive的動態分區介紹

​ hive的靜態分區需要用戶在插入數據的時候必須手動指定hive的分區字段值,但是這樣的話會導致用戶的操作複雜度提高,而且在使用的時候會導致數據只能插入到某一個指定分區,無法讓數據散列分佈,因此更好的方式是當數據在進行插入的時候,根據數據的某一個字段或某幾個字段值動態的將數據插入到不同的目錄中,此時,引入動態分區。

1.2、hive的動態分區配置

--hive設置hive動態分區開啓
	set hive.exec.dynamic.partition=true;
	默認:true
--hive的動態分區模式
	set hive.exec.dynamic.partition.mode=nostrict;
	默認:strict(至少有一個分區列是靜態分區)
--每一個執行mr節點上,允許創建的動態分區的最大數量(100)
	set hive.exec.max.dynamic.partitions.pernode;
--所有執行mr節點上,允許創建的所有動態分區的最大數量(1000)	
	set hive.exec.max.dynamic.partitions;
--所有的mr job允許創建的文件的最大數量(100000)	----對應1G內存
	set hive.exec.max.created.files;
	
這裏拓展下
	cat /proc/sys/fs/file-max --查看文件句柄數
	385915
這是因爲本虛擬機爲4G內存,1G內存對應大約10w個文件句柄數,4G差不多就是38w
	ulimit -a
裏面有個open files 參數值爲  1024
這個表示每個進程最多打開的文件數量
	

1.3、hive動態分區語法

--Hive extension (dynamic partition inserts):

	INSERT OVERWRITE TABLE tablename PARTITION (partcol1[=val1], partcol2[=val2] ...) 		select_statement FROM from_statement;
	
	INSERT INTO TABLE tablename PARTITION (partcol1[=val1], partcol2[=val2] ...) 			select_statement FROM from_statement;

動態分區操作如下即可
在這裏插入圖片描述

2、Hive分桶

2.1、Hive分桶的介紹

分區:對數據橫向切分;
分桶:對數據縱向切分;

	Bucketed tables are fantastic in that they allow much more efficient sampling than do non-bucketed tables, and they may later allow for time saving operations such as mapside joins. However, the bucketing specified at table creation is not enforced when the table is written to, and so it is possible for the table's metadata to advertise properties which are not upheld by the table's actual layout. This should obviously be avoided. Here's how to do it right.

跟MR中的HashPartitioner的原理一模一樣

     MR中:按照key的hash值去模除以reductTask的個數

     Hive中:按照分桶字段的hash值去模除以分桶的個數

注意:

​ 1、Hive分桶表是對列值取hash值的方式,將不同數據放到不同文件中存儲

​ 2、對於hive中每一個表、分區都可以進一步進行分桶

​ 3、由列的hash值除以桶的個數來決定每條數據劃分在哪個桶中

2.2、Hive分桶的配置

--設置hive支持分桶
	set hive.enforce.bucketing=true;
	----這個參數在1.x有的,2.x刪除掉了,默認支持分桶操作的(即爲true)

2.3、分桶的好處

1、方便抽樣
2、提高join查詢效率

2.4.hive分桶和分區的區別

1、分桶表和分區表的 桶數 和 分區數的 決定機制:

  • 分桶表的個數:由用戶的HQL語句所設置的reduceTask的個數決定

  • 表的分區的個數:也能由用戶自定義指定。也能由程序自動生成, 分區是可以動態增長的

2、分桶表和分區表的個數的區別:

  • 分桶表是一經決定,就不能更改,所以如果要改變桶數,要重新插入分桶數據
  • 分區數是可以動態增長的
    log日誌
    一天存一個分區

2.5、hive分桶的操作

  • 首先創建一個分桶的空表,注意:是分桶的空表

  • 然後創建個臨時表,往臨時表導入數據

  • 然後在從臨時表中分桶查詢出來的數據insert到分桶的空表裏

操作如下

2.5.1、創建分桶表

CREATE TABLE psnbucket( 
id INT, 
name STRING,
age INT) 
CLUSTERED BY (age) INTO 4 BUCKETS 
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY ','; 

2.5.2、創建臨時表插入數據

CREATE TABLE psn31(
id INT, name STRING, age INT)
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY ','; 

插入數據
1,tom,11 
2,cat,22 
3,dog,33 
4,hive,44 
5,hbase,55 
6,mr,66 
7,alice,77
8,scala,88

2.5.3 加載數據

insert into table psnbucket
select id, name, age from psn31;

2.5、數據分桶的缺陷

  • 如果通過數據文件LOAD 到分桶表中,會存在額外的MR負擔。
  • 實際生產中分桶策略使用頻率較低,更常見的還是使用數據分區。

2.5、Hive分桶的抽樣查詢

--案例
	select * from bucket_table tablesample(bucket 1 out of 4 on columns)
--TABLESAMPLE語法:
	TABLESAMPLE(BUCKET x OUT OF y)
		x:表示從哪個bucket開始抽取數據
		y:必須爲該表總bucket數的倍數或因子
		
例如:
	bucket 3 out of 8;
	x=3
	y=8
	表示從下標爲2的桶開始取數據,取(桶個數/y)數據
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章