大家好,我是明哥!

本片文章,我们来总结下,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;

2 SORT BY

  • SORT BY 不是对 SQL 的最终输出结果数据做排序,而是对 MAP 端的输出数据,在进入 reducer 前,根据指定的字段进行排序;

  • SORT BY 不会影响 REDUCER 的个数;

  • SORT BY 只会保证每个 reducer 内部的数据的顺序性,而不会保证 SQL 最终输出结果的全局有序性;

  • 示例语句: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 端的输出记录交给哪个 reducer 进一步处理的分发规则;

  • DISTRIBUTE BY 不会影响 REDUCER 的个数;

  • 具有相同的 Distribute By 字段的MAP端的输出数据,会被分发给同一个 reducer 进行处理 (默认是采用hash取模算法);

  • Distribute By 并不会保证每个 REDUCER 内部的所有记录的顺序性;

  • 示例语句:select distinct cust_id,id_no,part_date from ads_api_cda_basic_info_parquet_pt distribute by cust_id;

  • DISTRIBUTE BY 和 SORT BY 配合使用,可以保证每个 REDUCER 内部的所有记录的顺序性(此时,Distribute By 分区字段 和 SORT BY 排序字段,可以是不同的字段);

  • 示例语句: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 字段,可以解决以下问题:

    • Map输出的文件大小不均;

    • Reduce输出文件大小不均;

    • 小文件过多;

    • 文件超大;

4 CLUSTER BY

  • CLUSTER BY 等价于配合使用 DISTRIBUTE BY 和 SORT BY;

  • CLUSTER BY底层的 Distribute By 分区字段 和 SORT BY 排序字段,是同一个字段;

  • CLUSTER BY 不会影响 REDUCER 的个数;

  • 示例语句: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 桶表,桶表具有以下优势:

  • 桶表可以支持高效的 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

!关注不迷路~ 各种福利、资源定期分享!欢迎小伙伴们关注公众号!

!欢迎小伙伴们添加明哥微信,备注“加群交流”,拉你加入ABC技术交流群!

IT明哥

一篇文章彻底掌握 hive 中的 ORDER/SORT/CLUSTER/DISTRIBUTE BY 和 BUCKET 桶表相关推荐

  1. 一篇文章搞定java中的垃圾回收机制面试题

    一篇文章搞定java中的垃圾回收机制面试题 任何语言在运行过程中都会创建对象,也就意味着需要在内存中为这些对象在内存中分配空间,在这些对象失去使用的意义的时候,需要释放掉这些内容,保证内存能够提供给新 ...

  2. hive中的order by、sort by、distribute by、cluster by排序

    hive中的排序 说明:hive中有四种全局排序:order by.内部排序:sort by.分区排序:distribute by.组合排序:cluster by. order by(全局排序) 说明 ...

  3. Hive中的order by ,sort by ,distribute by , cluster by 区别

    #Hive的本质就是MapReduce #设置reduce个数 set mapreduce.job.reduces=num  //设置num数量的reduce #查看设置reduce个数 set ma ...

  4. hive 中排序order by,sort by,distribute by使用

    前提:hive 中使用的排序有oder by, sort by,distribute By,cluster By 具体使用如下 测试数据: 0: jdbc:hive2://hadoop-03:1000 ...

  5. 一篇文章彻底明白Hive数据存储的各种模式

    Hive的数据分为表数据和元数据,表数据是Hive中表格(table)具有的数据;而元数据是用来存储表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等.下面分别来介绍. 一 ...

  6. 一篇文章搞懂 Hive 的系统架构

    前言 本文隶属于专栏<1000个问题搞定大数据技术体系>,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见1000个问题搞定大数据技 ...

  7. mysql中12e10等于多少_一篇文章看懂mysql中varchar能存多少汉字、数字,以及varchar(100)和varchar(10)的区别...

    看完这篇文章,你能搞清楚以下问题: 1.varchar(100)和varchar(10)的区别在哪里? 2.varchar能存多少汉字.数字? 3.varchar的最大长度是多少呢? 4.字符.字节. ...

  8. 官方文档——一篇文章弄懂Flutter中的布局

    来自Flutter中文资源主页https://flutter.cn/ 原文:https://flutter.cn/docs/development/ui/layout Flutter 中的布局 要点 ...

  9. python 结构体数组 定义_一篇文章弄懂Python中所有数组数据类型

    前言 数组类型是各种编程语言中基本的数组结构了,本文来盘点下Python中各种"数组"类型的实现. list tuple array.array str bytes bytearr ...

最新文章

  1. Xilinx Altera FPGA中的逻辑资源(Slices VS LE)比较
  2. 常用加密算法的Java实现(一) ——单向加密算法MD5和SHA
  3. linux下批量替换文件内容的三种办法
  4. show status用法
  5. Java操作Hbase进行建表、删表以及对数据进行增删改查,条件查询
  6. C#设置代码只在调试模式下执行
  7. 为什么整数在python中表示d_python中整数的缓存机制
  8. mysql limti_mysql优化
  9. 关于下载(前后端)第1部分
  10. 【androidjniNDk】详细介绍每一步,让你轻松掌握android JNI NDk
  11. 窥探JAVA WEB
  12. C++语言基础 例程 派生类的声明与构成
  13. opencv3 学习三 - 图像输入输出显示等
  14. VisualStudio使用GIT
  15. 【Matlab学习笔记】【数学形态学】分水岭分割算法
  16. Qt--将Qt 动态链接生成的exe及依赖dll打包方法
  17. 创建虚拟机与安装系统
  18. 计算机的字体要怎么删除,计算机安装删除字体
  19. 基于DEAP库的NSGA2代码详解
  20. java 导出word 带图片

热门文章

  1. Android的Recovery中font_10x18.h字库文件制作
  2. 有效管理自己知识,多总结和分享——2018七月份的尾巴
  3. 信息安全-网络安全的三大支柱和攻击向量
  4. 【POJ No. 3104】 烘干衣服 Drying
  5. 关于0.2%费率的微信支付,你需要了解一下。
  6. 开源扫描仪的工具箱:安全行业从业人员自研开源扫描器合集
  7. TeamViewer连接时闪退
  8. 新基建下区块链基础设施建设
  9. python基础----简单语法篇
  10. 视频号功能更新,这些功能久等了