大家好,我是明哥!
本片文章,我们来总结下,HIVE 中的 order/sort/cluster/distribute by 和 BUCKET 桶表
1 ORDER BY ORDER BY 会对 SQL 的最终输出结果数据做全局排序; ORDER BY 底层只会有一个Reducer 任务 (多个Reducer无法保证全局有序); 当然只有一个 Reducer 任务时,如果输入数据规模较大,会消耗较长的计算时间; ORDER BY 默认的排序顺序是递增 ascending (ASC). 示例语句:select distinct cust_id,id_no,part_date from ads_api_cda_basic_info_parquet_pt order by cust_id;CLUSTER BY in spark web ui
5 BUCKET 桶表HIVE中有 BUCKET 桶表,桶表具有以下优势:
桶表可以支持高效的 sampling 取样; 桶表对高效的 mapside joins 的支持更好; 声明桶表时,需要指定分桶字段和桶的个数(CLUSTERED BY(user_id) INTO 31 BUCKETS); 桶表的写入操作,在底层执行时,会自动添加 CLUSTER BY 子语句 以按桶表声明时指定的分桶字段来分布数据;(如果是 0.x 或 1.x 的 HIVE 版本,需要配置参数 set hive.enforce.bucketing = true; HIVE 2.X 后,该参数被remove了,等价于总是TURE;) 桶表的写入操作,在底层执行时,会有reducer,且reducer的个数,会自动使用声明桶表时指定的桶的个数;(如果是 0.x 或 1.x 的 HIVE 版本,需要配置参数 set hive.enforce.bucketing = true; HIVE 2.X 后,该参数被remove了,等价于总是TURE;) 通过选用合适的分桶字段和分桶数,桶表可以有效管控表底层的小文件的个数,进而缓解数据倾斜问题和小文件问题; 使用桶表来缓解数据倾斜问题和小文件问题时,所有的更改都在 DDL 这一层,不需要更改 DML 语句添加 CLUSTER/DISTRIBUTE BY 子语句,同时由于 DDL 是系统上线时或后续运维优化调整时的一次性的操作,增加了系统的弹性和运维优化的便利性; 可以使用类似以下 DDL 语句来声明 BUCKET 桶表,类似以下DML语句来操作桶表:## 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