hive分桶表排序

張俊傑121發表於2020-09-26

參考

我是照著這個作者的文章學習, 並且自己又總結了一下, 畢竟本人能力有限,不可能完全照著官方文件去自己研究 = =所以很多東西都是把別人的知識偷過來,自己再練習一下總結一下,佔為己有,就變成自己的東西了…

原作者:
新增連結描述

準備資料

/root/soft/buckt_data.txt

1,name1
4,name4
3,name3
6,name6
5,name5
7,name7
9,name9
8,name8
2,name2

建立普通的表

create table test
(
    id   int comment 'ID',
    name string comment '名字'
)
    comment '測試分桶中間表'
    ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

用來導資料用, 因為要想往分割槽表裡面匯入資料必須要經過MapReduce程式

檢視

select *
from test;

現在是空的
往空的test臨時表裡面導資料

load data local inpath '/root/soft/buckt_data.txt' into table test;

再看一下test臨時表

select *
from test;

在這裡插入圖片描述
有了,但是資料是亂的.

建立排序的分桶表

每個分割槽筒裡面根據id升序

sql

create table test_bucket_sorted
(
    id   int comment 'ID',
    name string comment '名字'
)
    comment '測試分桶'
    clustered by (id) sorted by (id) into 4 buckets
    ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

檢視是否開啟了分桶和排序

sql

set hive.enforce.bucketing ;  -- 檢視分桶配置
set hive.enforce.sorting ;   -- 檢視排序配置

預設是false,需要配置成true

下面SQL依次執行一遍

sql:

set hive.enforce.bucketing=true; --開啟強制分桶,預設是不會幫你分桶的
set hive.enforce.sorting=true; -- 開啟強制排序,預設是不會幫你排序的.

從臨時表裡面匯入資料

上面已經執行了
sql:

select *
from test;

看到test這個臨時表資料是亂序的

在這裡插入圖片描述

開始匯入資料,
sql:

insert into test_bucket_sorted
select *
from test;

檢視匯入的結果

sql:

select *
from test_bucket_sorted;

在這裡插入圖片描述

看到這裡彆著急,最初我也是以為分桶表排序後查詢的順序也是一致的,其實結論不是這樣的, 因為你分桶表是給資料分到多個地方,多個地方里面每一個桶裡面才是根據某個欄位排序的,並不是查詢出來的就是語句就是排序的, 這點我在初學的時候我犯過這個錯誤…

驗證是否根據id進行排序了

登入hdfs
可以看到已經分了四個桶
在這裡插入圖片描述
依次開啟這四個檔案

shell:

[root@zjj101 ~]# hadoop fs -cat /user/hive/warehouse/test_bucket_sorted/000000_0
4,name4
8,name8
[root@zjj101 ~]# hadoop fs -cat /user/hive/warehouse/test_bucket_sorted/000001_0
1,name1
5,name5
9,name9
[root@zjj101 ~]# hadoop fs -cat /user/hive/warehouse/test_bucket_sorted/000002_0
2,name2
6,name6
[root@zjj101 ~]# hadoop fs -cat /user/hive/warehouse/test_bucket_sorted/000003_0
3,name3
7,name7
[root@zjj101 ~]# 

可以看到這四個檔案裡面每個都是根據第一個欄位進行排序的, 也就是根據id排序的. 這才是分桶表排序的地方, 並不是說我執行了select * from test_bucket_sorted; 看到的結果沒排序我就認為排序失敗了…這是我初學時候犯過的錯誤.
下面再仔細對比一下.
下面執行完了select * from test_bucket_sorted; 給四個桶的資料都打出來了,順序和上面 481592637 順序是一樣的.
在這裡插入圖片描述

相關文章