歡迎訪問我的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