Hive 中的分桶:在 Hive 中創建分桶表

已發表: 2021-02-17

使用大型數據集可能具有挑戰性。 有很多事情要跟踪,一個小錯誤可能會擾亂您的整個工作流程。 管理大型數據集的最突出的工具之一是分桶。

本文將告訴您如何在 Hive 中執行分桶。 我們將通過示例探索此函數的多種實現。

目錄

Hive 中的分桶是什麼?

分桶是一種數據組織技術。 雖然 Hive 中的分區和分桶是非常相似的概念,但分桶提供了將大型數據集劃分為更小且更易於管理的稱為桶的集合的附加功能。

使用 Hive 中的分桶,您可以將表數據集分解為更小的部分,使它們更易於處理。 Bucketing 允許您將相似的數據類型分組並將它們寫入一個文件,從而提高您在連接表或讀取數據時的性能。 這是我們大部分時間使用分桶和分區的一個重要原因。

我們什麼時候使用分桶?

分桶是一個非常有用的功能。 如果您以前沒有使用過它,您應該牢記以下幾點來確定何時使用此功能:

  • 當列具有高基數時,我們不能對其執行分區。 非常多的分區會生成太多的 Hadoop 文件,這會增加節點上的負載。 這是因為節點必須保留每個分區的元數據,這會影響該節點的性能。
  • 如果您的查詢有多個地圖側連接,則應該使用分桶。 map-side join 是一個只使用 map 函數而不使用 reduce 函數來連接兩個表的過程。

Hive 中分桶的亮點

Bucketing 基於散列函數,所以它有以下亮點:

  • hash_function 取決於您擁有的分桶列的類型。
  • 您應該記住,具有相同分桶列的記錄將存儲在同一個桶中。
  • 此功能要求您使用 Clustered By 子句將表劃分為桶。
  • 在表目錄中,Bucket 編號從 1 開始,每個 Bucket 都是一個文件。
  • 分桶是一個獨立的功能。 這意味著您可以在不對錶執行分區的情況下執行分桶。
  • 分桶表創建幾乎均勻分佈的數據文件部分。
  • 請注意,分桶並不能確保您的表格被正確填充。 因此,您必須自己管理將數據加載到存儲桶中,這可能很麻煩。

閱讀: Hive 與 Spark

Hive 中的分桶:示例 #1

最好通過一個例子來理解 Hive 中的分桶。 我們將在示例中使用以下數據:

EMPID 運動的城市國家
1001 埃梅里布萊爾籃球庫圖布拉普爾聖馬力諾
1002 澤弗爾斯蒂芬森蟋蟀尼爾哈倫多明尼加共和國
1003 秋天豆角,扁豆籃球尼爾哈倫多明尼加共和國
1004 卡西米爾萬斯羽毛球尼爾哈倫多明尼加共和國
1005 木夫套弗洛雷斯 庫圖布拉普爾聖馬力諾
1006 阿雅娜銀行足球尼爾哈倫多明尼加共和國
1007 塞爾瑪網球庫圖布拉普爾聖馬力諾
1008 伯克富勒羽毛球尼爾哈倫多明尼加共和國
1009 伊莫金特雷爾 庫圖布拉普爾聖馬力諾
1010 科羅拉多州哈欽森網球庫圖布拉普爾聖馬力諾

我們的樣本數據包含運動隊的員工信息。 但是,有些員工不屬於任何團隊。

以下是您可以復制粘貼到此示例中的示例數據:

id,名字,姓氏,體育,城市,國家

1001,Emerry, Blair, 籃球, Qutubullapur, 聖馬力諾

1002, Zephr, Stephenson, 板球, Neerharen, 多米尼加共和國

1003,秋天,豆,籃球,尼爾哈倫,多米尼加共和國

1004, Kasimir, Vance, Badminton, Neerharen, 多米尼加共和國

1005, Mufutau, Flores, Qutubullapur, 聖馬力諾

1006, Ayanna, Banks, Football, Neerharen, 多米尼加共和國

1007,塞爾瑪,球,網球,庫圖布拉普爾,聖馬力諾

1008, Berk, Fuller, Badminton, Neerharen, 多米尼加共和國

1009,Imogene,Terrell,,Qutubullapur,聖馬力諾

1010,科羅拉多,哈欽森,網球,庫圖布拉普爾,聖馬力諾

我們已經知道分桶允許我們將數據集聚類到更小的部分以進行優化。 現在讓我們討論如何完成這個過程:

創建基表

首先,我們將創建一個名為 employee_base 的表:

創建表 db_bdpbase.employee_base (

明確的 INT,

名字字符串,

姓氏字符串,

運動字符串,

城市字符串,

國家/地區字符串

)

行格式分隔

以“,”結尾的字段

存儲為文本文件

TBLPROPERTIES(“skip.header.line.count”=”1”);

我們的示例數據有一個分桶不需要的標頭,因此我們將通過添加“跳過標頭”屬性來刪除它。

將數據加載到基表中

我們將使用位置“/usr/bdp/hive/sample_data.csv”作為示例數據,並使用以下命令將其加載到表中:

加載數據輸入路徑'/user/bdp/hive/sample_data.csv' INTO TABLE db_bdpbase.employee_base;

創建分桶表

在本節中,我們將創建一個分桶表。 現在我們可以創建一個帶分區或不帶分區的桶表。

帶分區的分桶表

在這種情況下,國家是分區列,我們已經對我們按升序排序的 empid 列進行了桶裝:

創建表 db_bdpbase.bucketed_pa​​rtition_tbl (

空的INT,

名字字符串,

姓氏字符串,

運動字符串,

城市字符串

) 分區(國家/地區字符串)

由 (empid) 聚集

SORTED BY (empid ASC) 分成 4 個桶;

沒有分區的分桶表

或者,我們可以創建一個沒有分區的分桶表:

創建表 db_bdpbase.bucketed_tbl_only (

空的INT,

名字字符串,

姓氏字符串,

城市字符串,

國家/地區 STRING

)

由 (empid) 聚集

SORTED BY (empid ASC) 分成 4 個桶;

在這裡,我們將表存儲在同一列 empid 上。

設置屬性

Hive 中分桶的默認設置是禁用的,因此我們通過將其值設置為 true 來啟用它。 以下屬性將根據表格選擇集群和減速器的數量:

設置 hive.enforce.bucketing=TRUE; (在 Hive 2.x 以後不需要)

將數據加載到分桶表中

到目前為止,我們已經使用我們的示例數據創建了兩個分桶表和一個基表。 現在我們將通過在帶有分區的分桶表中使用以下命令將數據從基表加載到分桶表中:

插入覆蓋表 db_bdpbase.bucketed_pa​​rtition_tbl 分區(國家) SELECT * FROM db_bdpbase.employee_base;

要將數據加載到沒有任何分區的分桶表中,我們將使用以下命令:

插入覆蓋表 db_bdpbase.bucketed_tbl_only SELECT * FROM db_bdpbase.employee_base;

檢查分桶表數據

將數據加載到分桶表中後,我們將檢查它是如何存儲在 HDFS 中的。 我們將使用以下代碼檢查帶有分區的分桶表:

hadoop fs -ls hdfs://sandbox.hortonworks.com:8020/apps/hive/warehouse/db_bdpbase.db/bucketed_pa​​rtition_tbl

分桶表中的數據存儲

每個數據點都根據以下公式映射到特定的數據點:

hash_function(bucket_column) 模式 num_bucket

現在,考慮我們根據國家劃分的第一個表,我們的樣本數據將分為以下幾個部分:

EMPID 運動的城市國家
1002 澤弗爾斯蒂芬森蟋蟀尼爾哈倫多明尼加共和國
1003 秋天豆角,扁豆籃球尼爾哈倫多明尼加共和國
1004 卡西米爾萬斯羽毛球尼爾哈倫多明尼加共和國
1006 阿雅娜銀行足球尼爾哈倫多明尼加共和國
1008 伯克富勒羽毛球尼爾哈倫多明尼加共和國

EMPID 運動的城市國家
1001 埃梅里布萊爾籃球庫圖布拉普爾聖馬力諾
1005 木夫套弗洛雷斯 庫圖布拉普爾聖馬力諾
1007 塞爾瑪網球庫圖布拉普爾聖馬力諾
1009 伊莫金特雷爾 庫圖布拉普爾聖馬力諾
1010 科羅拉多州哈欽森網球庫圖布拉普爾聖馬力諾

對於多明加共和國,每一行都將存儲在存儲桶中:

hash_function(1002) mode 4 = 2(表示bucket的索引)

hash_function(1003) 模式 4 = 3

hash_function(1004) 模式 4 = 0

hash_function(1006) 模式 4 = 2

hash_function(1008) 模式 4 = 0

請注意,INT 值的 hash_function 會給您相同的結果。 您可以在 HDFS 位置檢查每個文件中的數據。 如果需要,您可以對數據庫中存在的其他國家/地區重複此過程。

Hive 中的分桶:示例 #2

由於我們已經介紹了實現此功能的各種步驟和過程,我們可以輕鬆地嘗試一下。 下面是一個在 Hive 中進行分桶的簡單示例。 在這裡,我們只將可用數據分成不同的部分,以便我們可以更輕鬆地管理它:

0: jdbc:hive2://cdh-vm.dbaglobe.com:10000/def> 創建表monthly_taxi_fleet6

. . . . . . . . . . . . . . . . . . . . . . .> (month char(7),fleet smallint,company varchar(50))

. . . . . . . . . . . . . . . . . . . . . . .> 由(公司)聚集成 3 個桶

. . . . . . . . . . . . . . . . . . . . . . .> 存儲為 avro;

使用 Apache Hive 版本 1.1.0-cdh5.13.1 的示例,默認情況下 hive.enforce.bucketing=false

0: jdbc:hive2://cdh-vm.dbaglobe.com:10000/def> 插入monthly_taxi_fleet6

. . . . . . . . . . . . . . . . . . . . . . .> 從monthly_taxi_fleet 中選擇月份、車隊、公司;

[upgrad@cdh-vm ~]$ hdfs dfs -ls -R /user/hive/warehouse/monthly_taxi_fleet6

-rwxrwxrwt 1 升級配置單元25483 2017-12-26 10:40 /user/hive/warehouse/monthly_taxi_fleet6/000000_0

— hive.enforce.bucketing:是否強制執行分桶。 如果為真,則在插入表時,會強制執行分桶。

— 默認值:Hive 0.x:假,Hive 1.x:假,Hive 2.x:已刪除,這實際上使其始終為真 (HIVE-12331)

0: jdbc:hive2://cdh-vm.dbaglobe.com:10000/def> 設置 hive.enforce.bucketing=true;

0: jdbc:hive2://cdh-vm.dbaglobe.com:10000/def> 插入monthly_taxi_fleet6

. . . . . . . . . . . . . . . . . . . . . . .> 從monthly_taxi_fleet 中選擇月份、車隊、公司;

[upgrad@cdh-vm ~]$ hdfs dfs -ls -R /user/hive/warehouse/monthly_taxi_fleet6

-rwxrwxrwt 1 升級配置單元13611 2017-12-26 10:43 /user/hive/warehouse/monthly_taxi_fleet6/000000_0

-rwxrwxrwt 1 升級配置單元6077 2017-12-26 10:43 /user/hive/warehouse/monthly_taxi_fleet6/000001_0

-rwxrwxrwt 1 升級配置單元6589 2017-12-26 10:43 /user/hive/warehouse/monthly_taxi_fleet6/000002_0

0:jdbc:hive2://cdh-vm.dbaglobe.com:10000/def>描述擴展monthly_taxi_fleet6;

+—————————–+——————————————————-+———-+–+

| col_name | 數據類型| 評論 |

+—————————–+——————————————————-+———-+–+

| | 字符(7) | |

| 車隊| 整數| |

| 公司| varchar(50) | |

| | | |

| 詳細表信息 | 表(表名:monthly_taxi_fleet6,dbName:default,所有者:upgrad,createTime:1514256031,lastAccessTime:0,retention:0,sd:StorageDescriptor(cols:[FieldSchema(name:month,type:char(7),comment:null) , FieldSchema(name:fleet, type:smallint, comment:null), FieldSchema(name:company, type:varchar(50), comment:null)], location:hdfs://cdh-vm.dbaglobe.com:8020 /user/hive/warehouse/monthly_taxi_fleet6, inputFormat:org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat, outputFormat:org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat,compressed:false, numBuckets :3, serdeInfo:SerDeInfo(name:null, serializationLib:org.apache.hadoop.hive.serde2.avro.AvroSerDe, 參數:{serialization.format=1}), bucketCols:[company], sortCols:[], 參數:{}, skewedInfo:SkewedInfo(skewedColNames:[], skewedColValues:[], skewedColValueLocationMaps:{}), storedAsSubDirectories:false), partitionKeys:[], 參數:{totalSize=26277, numRows=1128, rawDataSize=0, COLUMN_STATS_ACCURATE =true,numFiles=3,tra nsient_lastDdlTime=1514256192}, viewOriginalText:null, viewExpandedText:null, tableType:MANAGED_TABLE) | |

+—————————–+——————————————————-+———-+–+

選擇了 5 行(0.075 秒)

結帳:基本 Hive 面試問題

Hive 中的分桶:示例 #3

下面是一個在 Hive 中分桶的高級示例。 在這裡,我們執行了分區並使用排序依據功能使數據更易於訪問。 這是分桶的最大優勢之一。 您可以將它與其他功能一起使用,以更有效地管理大型數據集。

0: jdbc:hive2://cdh-vm.dbaglobe.com:10000/def> 創建表monthly_taxi_fleet7

. . . . . . . . . . . . . . . . . . . . . . .> (month char(7),fleet smallint)

. . . . . . . . . . . . . . . . . . . . . . .> 由 (company varchar(50)) 分區

. . . . . . . . . . . . . . . . . . . . . . .> 按(月)聚類,按(月)排序,分成 3 個桶

. . . . . . . . . . . . . . . . . . . . . . .> 存儲為 avro;

0: jdbc:hive2://cdh-vm.dbaglobe.com:10000/def> 插入monthly_taxi_fleet7

. . . . . . . . . . . . . . . . . . . . . . .> 分區(公司)

. . . . . . . . . . . . . . . . . . . . . . .> 從monthly_taxi_fleet 中選擇月份、車隊、公司;

[upgrad@cdh-vm ~]$ hdfs dfs -ls -R /user/hive/warehouse/monthly_taxi_fleet7

drwxrwxrwt – 升級 hive 0 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=CityCab

-rwxrwxrwt 1 升級配置單元865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=CityCab/000000_0

-rwxrwxrwt 1 升級配置單元865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=CityCab/000001_0

-rwxrwxrwt 1 升級配置單元865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=CityCab/000002_0

drwxrwxrwt – 升級配置單元0 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Comfort

-rwxrwxrwt 1 升級配置單元913 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Comfort/000000_0

-rwxrwxrwt 1 升級配置單元913 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Comfort/000001_0

-rwxrwxrwt 1 升級配置單元913 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Comfort/000002_0

drwxrwxrwt – 升級 hive 0 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Individual Yellow- Top

-rwxrwxrwt 1 升級配置單元865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Individual Yellow-Top/000000_0

-rwxrwxrwt 1 升級配置單元865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Individual Yellow-Top/000001_0

-rwxrwxrwt 1 升級配置單元865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Individual Yellow-Top/000002_0

drwxrwxrwt – 升級配置單元0 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Premier

-rwxrwxrwt 1 升級配置單元865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Premier/000000_0

-rwxrwxrwt 1 升級配置單元865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Premier/000001_0

-rwxrwxrwt 1 升級配置單元865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Premier/000002_0

drwxrwxrwt – 升級配置單元0 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Prime

-rwxrwxrwt 1 升級配置單元765 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Prime/000000_0

-rwxrwxrwt 1 升級配置單元765 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Prime/000001_0

-rwxrwxrwt 1 升級配置單元766 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Prime/000002_0

drwxrwxrwt – 升級 hive 0 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=SMRT

-rwxrwxrwt 1 升級配置單元865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=SMRT/000000_0

-rwxrwxrwt 1 升級配置單元865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=SMRT/000001_0

-rwxrwxrwt 1 升級配置單元865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=SMRT/000002_0

drwxrwxrwt – 升級 hive 0 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Smart

-rwxrwxrwt 1 升級配置單元720 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Smart/000000_0

-rwxrwxrwt 1 升級配置單元719 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Smart/000001_0

-rwxrwxrwt 1 升級配置單元719 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Smart/000002_0

drwxrwxrwt – 升級 hive 0 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=TransCab

-rwxrwxrwt 1 升級配置單元865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=TransCab/000000_0

-rwxrwxrwt 1 升級配置單元865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=TransCab/000001_0

-rwxrwxrwt 1 升級配置單元865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=TransCab/000002_0

drwxrwxrwt – 升級配置單元0 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=YTC

-rwxrwxrwt 1 升級配置單元432 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=YTC/000000_0

-rwxrwxrwt 1 升級配置單元432 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=YTC/000001_0

-rwxrwxrwt 1 升級配置單元432 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=YTC/000002_0

了解有關 Hive 中的分區和分桶的更多信息

在我們之前分享的示例中,我們以多種方式在 Hive 中執行了分區和分桶,並了解瞭如何在 Hive 中實現它們。 但是,Apache Hive 有許多其他功能,學習所有這些功能可能會讓人望而生畏。

這就是為什麼我們建議參加數據工程課程。 它可以讓您向在該行業工作多年的行業專家學習。 課程為您提供結構化的課程,您可以在其中逐步學習所有內容。 在 upGrad,我們提供專門的數據工程課程

通過我們的課程,您可以訪問 upGrad 的學生成功角,在那裡您可以獲得個性化的簡歷反饋、面試準備、職業諮詢和許多其他優勢。

完成課程後,您將成為一名熟練的數據工程專業人士。

結論

Hive 中的分桶非常簡單且易於執行。 對於大型數據集,這無疑是一個有用的功能。 但是,當您在 Hive 中同時執行分區和分桶時,您可以非常輕鬆地管理非常龐大的數據集。

如果您有興趣了解有關大數據計劃的更多信息,請查看我們的大數據軟件開發專業化 PG 文憑計劃,該計劃專為在職專業人士設計,提供 7 多個案例研究和項目,涵蓋 14 種編程語言和工具,實用的手在研討會上,超過 400 小時的嚴格學習和頂級公司的就業幫助。

如果您對存儲桶有任何疑問或想法,請在下面的評論中分享。 我們很樂意聽取您的意見。

在 upGrad 查看我們的其他軟件工程課程。

提升自己並為未來做好準備

IIIT Bangalore 大數據高級證書課程