一篇文章徹底掌握 Hive 中的 Order/Sort/Cluster/Distribute by和 Bucket 桶表
作者: IT明哥
本篇文章,我們來(lái)總結(jié)下,HIVE 中的 order/sort/cluster/distribute by 和 BUCKET 桶表。
大家好,我是明哥!
本片文章,我們來(lái)總結(jié)下,HIVE 中的 order/sort/cluster/distribute by 和 BUCKET 桶表
1 ORDER BY
- ORDER BY 會(huì)對(duì) SQL 的最終輸出結(jié)果數(shù)據(jù)做全局排序;
- ORDER BY 底層只會(huì)有一個(gè)Reducer 任務(wù) (多個(gè)Reducer無(wú)法保證全局有序);
- 當(dāng)然只有一個(gè) Reducer 任務(wù)時(shí),如果輸入數(shù)據(jù)規(guī)模較大,會(huì)消耗較長(zhǎng)的計(jì)算時(shí)間;
- ORDER BY 默認(rèn)的排序順序是遞增 ascending (ASC).
- 示例語(yǔ)句:select distinct cust_id,id_no,part_date from ads_api_cda_basic_info_parquet_pt order by cust_id;
2 SORT BY
- SORT BY 不是對(duì) SQL 的最終輸出結(jié)果數(shù)據(jù)做排序,而是對(duì) MAP 端的輸出數(shù)據(jù),在進(jìn)入 reducer 前,根據(jù)指定的字段進(jìn)行排序;
- SORT BY 不會(huì)影響 REDUCER 的個(gè)數(shù);
- SORT BY 只會(huì)保證每個(gè) reducer 內(nèi)部的數(shù)據(jù)的順序性,而不會(huì)保證 SQL 最終輸出結(jié)果的全局有序性;
- 示例語(yǔ)句:select distinct cust_id,id_no,part_date from ads_api_cda_basic_info_parquet_pt SORT by cust_id;圖片
3 DISTRIBUTE BY
- DISTRIBUTE BY 指定了將 MAP 端的輸出記錄交給哪個(gè) reducer 進(jìn)一步處理的分發(fā)規(guī)則;
- DISTRIBUTE BY 不會(huì)影響 REDUCER 的個(gè)數(shù);
- 具有相同的 Distribute By 字段的MAP端的輸出數(shù)據(jù),會(huì)被分發(fā)給同一個(gè) reducer 進(jìn)行處理 (默認(rèn)是采用hash取模算法);
- Distribute By 并不會(huì)保證每個(gè) REDUCER 內(nèi)部的所有記錄的順序性;
- 示例語(yǔ)句:select distinct cust_id,id_no,part_date from ads_api_cda_basic_info_parquet_pt distribute by cust_id;圖片
- DISTRIBUTE BY 和 SORT BY 配合使用,可以保證每個(gè) REDUCER 內(nèi)部的所有記錄的順序性(此時(shí),Distribute By 分區(qū)字段 和 SORT BY 排序字段,可以是不同的字段);
- 示例語(yǔ)句:select distinct cust_id,id_no,part_date from ads_api_cda_basic_info_parquet_pt distribute by cust_id sort by id_no;
- DISTRIBUTE BY 和 SORT BY 配合使用,并選用合適的 DISTRIBUTE BY 字段,可以解決以下問(wèn)題:
- Map輸出的文件大小不均;
- Reduce輸出文件大小不均;
- 小文件過(guò)多;
- 文件超大;
4 CLUSTER BY
- CLUSTER BY 等價(jià)于配合使用 DISTRIBUTE BY 和 SORT BY;
- CLUSTER BY底層的 Distribute By 分區(qū)字段 和 SORT BY 排序字段,是同一個(gè)字段;
- CLUSTER BY 不會(huì)影響 REDUCER 的個(gè)數(shù);
- 示例語(yǔ)句:select distinct cust_id,id_no,part_date from ads_api_cda_basic_info_parquet_pt cluster by cust_id;
CLUSTER BY in spark web ui
5 BUCKET 桶表
HIVE中有 BUCKET 桶表,桶表具有以下優(yōu)勢(shì):
- 桶表可以支持高效的 sampling 取樣;
- 桶表對(duì)高效的 mapside joins 的支持更好;
- 聲明桶表時(shí),需要指定分桶字段和桶的個(gè)數(shù)(CLUSTERED BY(user_id) INTO 31 BUCKETS);
- 桶表的寫入操作,在底層執(zhí)行時(shí),會(huì)自動(dòng)添加 CLUSTER BY 子語(yǔ)句 以按桶表聲明時(shí)指定的分桶字段來(lái)分布數(shù)據(jù);(如果是 0.x 或 1.x 的 HIVE 版本,需要配置參數(shù) set hive.enforce.bucketing = true; HIVE 2.X 后,該參數(shù)被remove了,等價(jià)于總是TURE;)
- 桶表的寫入操作,在底層執(zhí)行時(shí),會(huì)有reducer,且reducer的個(gè)數(shù),會(huì)自動(dòng)使用聲明桶表時(shí)指定的桶的個(gè)數(shù);(如果是 0.x 或 1.x 的 HIVE 版本,需要配置參數(shù) set hive.enforce.bucketing = true; HIVE 2.X 后,該參數(shù)被remove了,等價(jià)于總是TURE;)
- 通過(guò)選用合適的分桶字段和分桶數(shù),桶表可以有效管控表底層的小文件的個(gè)數(shù),進(jìn)而緩解數(shù)據(jù)傾斜問(wèn)題和小文件問(wèn)題;
- 使用桶表來(lái)緩解數(shù)據(jù)傾斜問(wèn)題和小文件問(wèn)題時(shí),所有的更改都在 DDL 這一層,不需要更改 DML 語(yǔ)句添加 CLUSTER/DISTRIBUTE BY 子語(yǔ)句,同時(shí)由于 DDL 是系統(tǒng)上線時(shí)或后續(xù)運(yùn)維優(yōu)化調(diào)整時(shí)的一次性的操作,增加了系統(tǒng)的彈性和運(yùn)維優(yōu)化的便利性;
- 可以使用類似以下 DDL 語(yǔ)句來(lái)聲明 BUCKET 桶表,類似以下DML語(yǔ)句來(lái)操作桶表:
- ## DDL
- CREATE TABLE bucket_tableA(user_id BIGINT, firstname STRING, lastname STRING)
- COMMENT 'A bucketed copy of user_info'
- PARTITIONED BY(ds STRING)
- CLUSTERED BY(user_id) INTO 31 BUCKETS;
- ## DML
- INSERT OVERWRITE bucket_tableA select * from xx;
INSERT OVERWRITE bucket_tableA SPARK WEB UI
責(zé)任編輯:武曉燕
來(lái)源:
明哥的IT隨筆