Hive分桶表

一:簡介

分桶規則:對分桶字段值進行哈希,哈希值除以桶的個數求餘,餘數決定了該條記錄在哪個桶中,也就是餘數相同的在一個桶中。

分桶語法:創建表時使用clustered子句指定要分桶的字段和分桶的數量,也可以指定排序。

<code>clustered by(字段名) sorted by (排序字段)  into 數量 buckets/<code>

hive分桶作用:

  1. 方便抽樣:在處理大規模數據集時,在開發和修改查詢的階段,如果能在數據集的一小部分數據上試運行查詢,會帶來很多方便。
  2. 提高join查詢效率: 對於JOIN操作兩個表有一個相同的列,如果對這兩個表都進行了桶操作。那麼將保存相同列值的桶進行JOIN操作就可以,可以大大減少JOIN的數據量。

二:示例

1. 創建分桶表
<code>create table tbl_bucket(id bigint, name string)
clustered by(id) sorted by (id) into 4 buckets
row format delimited
fields terminated by ","
lines terminated by "\\n";/<code>
2. 準備測試數據
<code>echo "1,name1\\n2,name2\\n3,name3\\n4,name4\\n5,name5\\n6,name6\\n7,name7" > /tmp/bucket.txt/<code>
3. 加載數據

插入分桶表不能直接使用load data加載數據,需要藉助中間表來實現。

<code>-- 創建中間表
hive> create table tbl_tmp(id bigint, name string)
row format delimited
fields terminated by ","
lines terminated by "\\n";

-- 加載數據到中間表
hive> load data local inpath '/tmp/bucket.txt' into table tbl_tmp;

-- 從中間表中插入數據到分桶表
hive> insert into tbl_bucket select * from tbl_tmp;/<code>
Hive分桶表

4. 查看hdfs
Hive分桶表

<code>hadoop fs -cat /data/hive/warehouse/test.db/tbl_bucket/000000_0
hadoop fs -cat /data/hive/warehouse/test.db/tbl_bucket/000001_0
hadoop fs -cat /data/hive/warehouse/test.db/tbl_bucket/000002_0
hadoop fs -cat /data/hive/warehouse/test.db/tbl_bucket/000003_0/<code>
<code>hive> select * from tbl_bucket;/<code>
Hive分桶表

三:Join操作

  1. 準備數據
<code>echo "1,name1\\n2,name2\\n3,name3\\n4,name4\\n5,name5\\n6,name6\\n7,name7" > /tmp/user.txt
echo "1,shanghai,1\\n2,beijing,1\\n3,shenzhen,2\\n4,hangzhou,3\\n5,suzhou,4\\n6,guangzhou,4\\n7,zhengzhou,5" > /tmp/address.txt/<code>
  1. 創建分桶表並添加數據
<code>-- 對id進行分桶
hive> create table tbl_user(id bigint, name string)
clustered by(id) sorted by (id) into 4 buckets
row format delimited
fields terminated by ","
lines terminated by "\\n";

hive> create table tbl_user_tmp(id bigint, name string)
row format delimited
fields terminated by ","
lines terminated by "\\n";

hive> load data local inpath '/tmp/user.txt' into table tbl_user_tmp;
hive> insert into tbl_user select * from tbl_user_tmp;


-- 對user_id進行分桶
hive> create table tbl_address(id bigint, city string, user_id bigint)
clustered by(user_id) sorted by (user_id) into 4 buckets
row format delimited
fields terminated by ","
lines terminated by "\\n";

hive> create table tbl_address_tmp(id bigint, city string, user_id bigint)
row format delimited
fields terminated by ","
lines terminated by "\\n";

hive> load data local inpath '/tmp/address.txt' into table tbl_address_tmp;
hive> insert into tbl_address select * from tbl_address_tmp;/<code>
Hive分桶表

<code>hadoop fs -cat /data/hive/warehouse/test.db/tbl_user/000000_0
hadoop fs -cat /data/hive/warehouse/test.db/tbl_user/000001_0
hadoop fs -cat /data/hive/warehouse/test.db/tbl_user/000002_0
hadoop fs -cat /data/hive/warehouse/test.db/tbl_user/000003_0


hadoop fs -cat /data/hive/warehouse/test.db/tbl_address/000000_0
hadoop fs -cat /data/hive/warehouse/test.db/tbl_address/000001_0
hadoop fs -cat /data/hive/warehouse/test.db/tbl_address/000002_0
hadoop fs -cat /data/hive/warehouse/test.db/tbl_address/000003_0/<code>

tbluser和tbladdress相關的數據都分在同一個桶中。

Hive分桶表

  1. 多表連接
<code>select tu.id, tu.name, ta.city 
from tbl_user tu
left join tbl_address ta on tu.id = ta.user_id
where tu.id <= 3;/<code>
Hive分桶表

四:Hive 分桶和分區的區別

hdfs文件個數:

  • 分桶的數量是在創建表時指定的,數量不能更改。如果要更改數量,需要重新插入數據。
  • 分區的數量是根據字段枚舉值的個數決定的,系統決定的,分區個數是動態增長的。

作用:

  • 分區:是用於提高查詢效率(避免掃描整個表,只需要掃描相關部分即可。例如日誌文件可以按日期天分區,每天一個分區)
  • 分桶:提高join查詢效率,方便抽樣

值:

  • 分區中的每條數據中的分區字段值都是完全相同的
  • 分桶中的每條數據的分桶字段值餘上分桶數量的結構都是一樣的。即分桶中的每個分桶字段值都不一樣。


分享到:


相關文章: