当前位置: 首页 > news >正文

通俗易懂理解Hive四种排序

前言

Hive的四种排序包括Sort By、Order By、Distribute By和Cluster By。有关这四种排序的区别,在大数据面试中可能会经常被问到,在我们很多人的实际应用中可能最常用的就是全局排序order by,因此对于其他几个排序理解并不准确,接下来我用简单的案例尽量描述清楚。

数据准备

  1. Hive表

    create table scores (
    name string,
    class string,
    score int
    );
    
  2. 插入数据

    insert into scores values('Lily','1',72),('Mark','2',77),('Lucy','1',83),('Wade','2',92),
    ('Jack','1',91),('James','2',84),('Kobe','2',94),('Jay','1',85);
    
  3. 查询数据

    select * from scores;
    

    在这里插入图片描述

ORDER BY

ORDER BY 会对全局数据进行排序,这意味着Hive会启动一个单独的reducer来接收所有mapper的输出,并在这个reducer中进行排序。这种方式在数据量很大时效率很低,因为所有数据都需要通过网络传输到一个reducer。

  • 需求
    查询按照分数从高到低排序整个表的数据。

  • SQL

    SELECT name,CLASS,score
    FROM scores
    ORDER BY score DESC;
    
  • 结果
    在这里插入图片描述

SORT BY

SORT BY 是在每个reducer内部进行排序的。这意味着如果你使用SORT BY而没有DISTRIBUTE BY(或CLUSTER BY,它包含了DISTRIBUTE BY),Hive可能会随机地将数据分发到不同的reducer,每个reducer内部的数据会按照SORT BY指定的列进行排序。但不同的reducer之间的数据顺序是不确定的。

  • 需求
    每个班级内部的学生按照分数排序,但不需要全局排序。
  • SQL(需要配合DISTRIBUTE BY使用以控制分发)
    SELECT name,CLASS,score
    FROM scores DISTRIBUTE BY CLASS
    SORT BY score DESC;
    
  • 结果
    在这里插入图片描述

DISTRIBUTE BY

distribute by是控制在map端如何拆分数据给reduce端的。类似于MapReduce中分区partationer对数据进行分区hive会根据distribute by后面列,将数据分发给对应的reducer,默认是采用hash算法+取余数的方式。
sort by为每个reduce产生一个排序文件,在有些情况下,你需要控制某写特定的行应该到哪个reducer,这通常是为了进行后续的聚集操作。distribute by刚好可以做这件事。因此,distribute by经常和sort by配合使用。

CLUSTER BY

cluster by除了具有distribute by的功能外还兼具sort by的功能。但是排序只能是升序排序,不能指定排序规则为ASC或者DESC。
当分区字段和排序字段相同cluster by可以简化distribute by+sort by 的SQL 写法,也就是说当distribute by和sort by 字段相同时,可以使用cluster by 代替distribute by和sort by。

  • 需求
    每个班级内部的学生按照分数排序,但不需要全局排序。

  • SQL

    SELECT name,CLASS,score
    FROM scores CLUSTER BY CLASS;
    
  • 结果
    在这里插入图片描述

总结

  • order by 是全局排序,可能性能会比较差;
  • sort by分区内有序,往往配合distribute by来确定该分区都有那些数据;
  • distribute by 确定了数据分发的规则,满足相同条件的数据被分发到一个reducer;
  • cluster by 当distribute by和sort by 字段相同时,可以使用cluster by 代替distribute by和sort by,但是cluster by默认是升序,不能指定排序方向;

参考文献

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+SortBy

https://sqlrelease.com/sort-by-order-by-distribute-by-and-cluster-by-in-hive

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【C++二分查找】1818. 绝对差值和
  • Java并发编程实战 06 | 为什么不建议使用线程优先级?
  • 企业级Ansible自动化运维项目案例:实战与技巧
  • Spring MVC: 构建Web应用的强大框架
  • 好用的 Markdown 编辑器组件
  • Python和MATLAB(Java)及Arduino和Raspberry Pi(树莓派)点扩展函数导图
  • Laravel安全应用模块示例教程
  • 【视频讲解】Python贝叶斯卷积神经网络分类胸部X光图像数据集实例
  • 仿华为车机UI--图标从Workspace拖动到Hotseat同时保留图标在原来位置
  • 从监控到智能:EasyCVR视频汇聚平台助力加油站安全监管升级转型
  • 黑神话:游戏的诞生
  • 桥接模式bridge
  • leetcode :746使用最小花费爬楼梯
  • 微软云技术深度解析与实战案例
  • 算法打卡——田忌赛马问题
  • JS 中的深拷贝与浅拷贝
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • Apache Pulsar 2.1 重磅发布
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • Python_网络编程
  • spring学习第二天
  • web标准化(下)
  • XML已死 ?
  • 和 || 运算
  • 聚簇索引和非聚簇索引
  • 面试遇到的一些题
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 深入 Nginx 之配置篇
  • 数组大概知多少
  • 思否第一天
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • 阿里云移动端播放器高级功能介绍
  • 第二十章:异步和文件I/O.(二十三)
  • # Maven错误Error executing Maven
  • (10)STL算法之搜索(二) 二分查找
  • (C++二叉树05) 合并二叉树 二叉搜索树中的搜索 验证二叉搜索树
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (floyd+补集) poj 3275
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (七)Appdesigner-初步入门及常用组件的使用方法说明
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (算法)求1到1亿间的质数或素数
  • (一)、软硬件全开源智能手表,与手机互联,标配多表盘,功能丰富(ZSWatch-Zephyr)
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • (转)winform之ListView
  • (转)创业家杂志:UCWEB天使第一步
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .Net CF下精确的计时器
  • .net core 管理用户机密
  • .net mvc actionresult 返回字符串_.NET架构师知识普及
  • .NET企业级应用架构设计系列之应用服务器