歡迎訪問我的GitHub
https://github.com/zq2599/blog_demos
內容:所有原創文章分類彙總及配套原始碼,涉及Java、Docker、Kubernetes、DevOPS等;
《hive學習筆記》系列導航
本篇概覽
本文是《hive學習筆記》的第五篇,前文學習了分割槽表,很容易發現分割槽表的問題:
- 分割槽欄位的每個值都會建立一個資料夾,值越多資料夾越多;
- 不合理的分割槽會導致有的資料夾下資料過多,有的過少;
此時可以考慮分桶的方式來分解資料集,分桶原理可以參考MR中的HashPartitioner,將指定欄位的值做hash後,根據桶的數量確定該記錄放在哪個桶中,另外,在join查詢和資料取樣時,分桶都能提升查詢效率;
- 接下來開始實戰;
配置
- 執行以下設定,使得hive根據桶的數量自動調整上一輪reducers數量:
set hive.enforce.bucketing = true;
- 如果不執行上述設定,您需要自行設定mapred.reduce.tasks引數,以控制reducers數量,本文我們們配置為hive自動調整;
準備資料
接下來先準備外部表t13,往裡面新增一些資料,將t13作為後面分桶表的資料來源:
- 表名t13,只有四個欄位:
create external table t13 (name string, age int, province string, city string)
row format delimited
fields terminated by ','
location '/data/external_t13';
- 建立名為013.txt的檔案,內容如下:
tom,11,guangdong,guangzhou
jerry,12,guangdong,shenzhen
tony,13,shanxi,xian
john,14,shanxi,hanzhong
- 將013.txt中的四條記錄載入t13:
load data
local inpath '/home/hadoop/temp/202010/25/013.txt'
into table t13;
分桶
- 建立表t14,指定欄位分桶,桶數量為16:
create table t14 (name string, age int, province string, city string)
clustered by (province, city) into 16 buckets
row format delimited
fields terminated by ',';
- 從t13匯入資料,注意語法是from t13開始,要用overwrite關鍵字:
from t13
insert overwrite table t14
select name, age, province, city;
- 匯入過程如下圖所示,可見reducer數量已被自動調整為桶數量:
- 匯入後,檢視hdfs,可見被分為16個檔案,(和分割槽對比一下,分割槽是不同的資料夾):
取樣
執行以下語句,取樣檢視t14的資料:
hive> select * from t14 tablesample(bucket 1 out of 2 on province, city);
OK
tom 11 guangdong guangzhou
john 14 shanxi hanzhong
Time taken: 0.114 seconds, Fetched: 2 row(s)
- 至此,分桶操作就完成了,基礎知識的實踐已經完成,接下來開始一些進階實踐;
你不孤單,欣宸原創一路相伴
歡迎關注公眾號:程式設計師欣宸
微信搜尋「程式設計師欣宸」,我是欣宸,期待與您一同暢遊Java世界...
https://github.com/zq2599/blog_demos