hive學習筆記之五:分桶

程式設計師欣宸發表於2021-07-03

歡迎訪問我的GitHub

https://github.com/zq2599/blog_demos

內容:所有原創文章分類彙總及配套原始碼,涉及Java、Docker、Kubernetes、DevOPS等;

《hive學習筆記》系列導航

  1. 基本資料型別
  2. 複雜資料型別
  3. 內部表和外部表
  4. 分割槽表
  5. 分桶
  6. HiveQL基礎
  7. 內建函式
  8. Sqoop
  9. 基礎UDF
  10. 使用者自定義聚合函式(UDAF)
  11. UDTF

本篇概覽

本文是《hive學習筆記》的第五篇,前文學習了分割槽表,很容易發現分割槽表的問題:

  1. 分割槽欄位的每個值都會建立一個資料夾,值越多資料夾越多;
  2. 不合理的分割槽會導致有的資料夾下資料過多,有的過少;
    此時可以考慮分桶的方式來分解資料集,分桶原理可以參考MR中的HashPartitioner,將指定欄位的值做hash後,根據桶的數量確定該記錄放在哪個桶中,另外,在join查詢和資料取樣時,分桶都能提升查詢效率;
  • 接下來開始實戰;

配置

  1. 執行以下設定,使得hive根據桶的數量自動調整上一輪reducers數量:
set hive.enforce.bucketing = true;
  1. 如果不執行上述設定,您需要自行設定mapred.reduce.tasks引數,以控制reducers數量,本文我們們配置為hive自動調整;

準備資料

接下來先準備外部表t13,往裡面新增一些資料,將t13作為後面分桶表的資料來源:

  1. 表名t13,只有四個欄位:
create external table t13 (name string, age int, province string, city string) 
row format delimited 
fields terminated by ',' 
location '/data/external_t13';
  1. 建立名為013.txt的檔案,內容如下:
tom,11,guangdong,guangzhou
jerry,12,guangdong,shenzhen
tony,13,shanxi,xian
john,14,shanxi,hanzhong
  1. 013.txt中的四條記錄載入t13
load data 
local inpath '/home/hadoop/temp/202010/25/013.txt' 
into table t13;

分桶

  1. 建立表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 ',';
  1. t13匯入資料,注意語法是from t13開始,要用overwrite關鍵字:
from t13
insert overwrite table t14 
select name, age, province, city;
  1. 匯入過程如下圖所示,可見reducer數量已被自動調整為桶數量:

在這裡插入圖片描述

  1. 匯入後,檢視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)
  • 至此,分桶操作就完成了,基礎知識的實踐已經完成,接下來開始一些進階實踐;

你不孤單,欣宸原創一路相伴

  1. Java系列
  2. Spring系列
  3. Docker系列
  4. kubernetes系列
  5. 資料庫+中介軟體系列
  6. DevOps系列

歡迎關注公眾號:程式設計師欣宸

微信搜尋「程式設計師欣宸」,我是欣宸,期待與您一同暢遊Java世界...
https://github.com/zq2599/blog_demos

相關文章