Hive 中 Order By、Sort By、Cluster By 和 Distribute By 的详细解析

Hive 中 Order By、Sort By、Cluster By 和 Distribute By 的详细解析

在 Hive 数据查询与处理操作中,Order BySort ByCluster ByDistribute By 这些语句对于数据的排序、分区以及在 Reduce 阶段的处理起着关键作用。本文将详细解析它们各自的语法、区别以及一些使用要点,帮助大家深入理解并正确运用这些功能。

一、Order By 语法

Hive QL 中的 ORDER BY 语法与 SQL 语言中的 ORDER BY 语法相似。

(一)语法组成

colOrder: ( ASC | DESC )
colNullOrder: (NULLS FIRST | NULLS LAST)           -- (注意:在 Hive 2.1.0 及之后版本可用)
orderBy: ORDER BY colName colOrder? colNullOrder? (',' colName colOrder? colNullOrder?)*
query: SELECT expression (',' expression)* FROM src orderBy

(二)使用限制与注意事项

  1. 在严格模式(即 hive.mapred.mode=strict)下,ORDER BY 子句后面必须跟 LIMIT 子句;若将 hive.mapred.mode 设置为非严格模式,则不需要 LIMIT 子句。这是因为要对所有结果施加全局排序,就需要一个 Reducer 来对最终输出进行排序,如果输出的行数过多,单个 Reducer 可能会花费很长时间来完成排序工作。
  2. 通常是按列名指定列进行排序,不过在 Hive 0.11.0 及之后版本,若进行如下配置,则可以按位置指定列:
    • 对于 Hive 0.11.0 到 2.1.x 版本,设置 hive.groupby.orderby.position.aliastrue(默认值为 false)。
    • 对于 Hive 2.2.0 及之后版本,hive.orderby.position.alias 默认值为 true
  3. 默认的排序顺序是升序(ASC)。在 Hive 2.1.0 及之后版本,支持为 ORDER BY 子句中的每个列指定空值排序顺序,升序(ASC)时默认空值排序顺序为 NULLS FIRST,降序(DESC)时默认空值排序顺序为 NULLS LAST
  4. 在 Hive 3.0.0 及之后版本,子查询和视图中不带 LIMITORDER BY 语句会被优化器移除,若要禁用此功能,可设置 hive.remove.orderby.in.subqueryfalse

二、Sort By 语法

SORT BY 语法同样与 SQL 语言中的 ORDER BY 语法类似,其语法如下:

colOrder: ( ASC | DESC )
sortBy: SORT BY colName colOrder? (',' colName colOrder?)*
query: SELECT expression (',' expression)* FROM src sortBy

Hive 会依据 SORT BY 中指定的列在将数据行发送给 Reducer 之前对其进行排序,排序顺序取决于列的数据类型。如果列是数值类型,则按数值顺序排序;若是字符串类型,则按字典序排序。另外,在 Hive 3.0.0 及之后版本,子查询和视图中不带 LIMITSORT BY 语句会被优化器移除,同样可通过设置 hive.remove.orderby.in.subqueryfalse 来禁用此移除操作。

三、Sort By 和 Order By 的区别

Hive 支持 SORT BY 对每个 Reducer 内的数据进行排序,而 ORDER BYSORT BY 的区别在于:前者保证输出结果的全局有序性,后者仅保证在每个 Reducer 内数据行的有序性。如果存在多个 Reducer,使用 SORT BY 可能会得到部分有序的最终结果。

需要注意的是,单独的单列 SORT BYCLUSTER BY 之间的区别可能容易混淆。区别在于 CLUSTER BY 是依据字段进行分区,而 SORT BY 在有多个 Reducer 时会随机分区以便在各个 Reducer 间均匀分配数据(和负载)。例如:

SELECT key, value FROM src SORT BY key ASC, value DESC

假设有 2 个 Reducer,每个 Reducer 的输出可能是如下这样部分有序的情况:

0   5
0   3
3   6
9   1
0   4
0   3
1   1
2   5

四、Sort By 的类型设置

在进行数据转换后,变量类型通常会被视为字符串,这意味着数值数据将按字典序排序。为解决这个问题,可以在使用 SORT BY 之前使用带有类型转换(cast)的第二个 SELECT 语句,示例如下:

FROM (FROM (FROM srcSELECT TRANSFORM(value)USING 'mapper'AS value, count) mappedSELECT cast(value as double) AS value, cast(count as int) AS countSORT BY value, count) sorted
SELECT TRANSFORM(value, count)
USING 'reducer'
AS whatever

五、Cluster By 和 Distribute By 语法

Cluster ByDistribute By 主要在转换/Map - Reduce 脚本中使用,但在某些情况下,如果需要对查询输出进行分区和排序以供后续查询使用,在 SELECT 语句中也很有用。

(一)Cluster By

Cluster ByDistribute BySORT BY 的快捷方式,它会根据指定列同时进行数据的分区和排序操作。

(二)Distribute By

Hive 使用 Distribute By 中的列将数据行分配到各个 Reducer 中,所有具有相同 Distribute By 列值的行都会被分配到同一个 Reducer,但 Distribute By 并不保证对分配的键具有聚类或排序属性。例如,对以下 5 行数据基于 x 进行 Distribute By 分配到 2 个 Reducer 中:

x1
x2
x4
x3
x1

则可能出现如下分配情况:

Reducer 1 得到:

x1
x2
x1

Reducer 2 得到:

x4
x3

可以看到,虽然能保证相同键 x1 的行被分配到同一个 Reducer(此处为 Reducer 1),但并不能保证它们在 Reducer 内是相邻聚集的。

而如果使用 Cluster By x,两个 Reducer 会进一步依据 x 对行进行排序,例如:

Reducer 1 得到:

x1
x1
x2

Reducer 2 得到:

x3
x4

用户也可以分别指定 Distribute BySORT BY,此时分区列和排序列可以不同,通常情况下分区列是排序列的前缀,但这并非强制要求,示例如下:

SELECT col1, col2 FROM t1 CLUSTER BY col1
SELECT col1, col2 FROM t1 DISTRIBUTE BY col1SELECT col1, col2 FROM t1 DISTRIBUTE BY col1 SORT BY col1 ASC, col2 DESC
FROM (FROM pv_usersMAP ( pv_users.userid, pv_users.date )USING 'map_script'AS c1, c2, c3DISTRIBUTE BY c2SORT BY c2, c1) map_output
INSERT OVERWRITE TABLE pv_users_reducedREDUCE ( map_output.c1, map_output.c2, map_output.c3 )USING 'reducer'AS date, count;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/63222.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

okHttp的tcp连接池的复用

okhttp的连接池是tcp连接池吧,是两台机器之间的连接,ip:port连接,然后具体的接口再添加具体的url吗? 具体的 HTTP 请求(包括 URL、请求方法、头部等)则是在复用的 TCP 连接上进行传输的。 是的&#xff0c…

Linux 正确关机方式详解

在Linux系统中,正确地关机是一个重要的操作,它不仅影响到系统的数据完整性,还可能影响到其他用户的工作。本文将详细介绍Linux系统中的各种关机方式,包括它们的使用场景和具体命令。 为什么需要正确关机 在DOS和Windows系统中&a…

在商业智能BI系统中,如何配置高级感的数据可视化折线图?

在数据可视化的世界里,折线图作为一种直观且有效的数据展示方式,被广泛应用于各类数据分析与报告中。折线图不仅能够清晰地展示数据随时间或其他连续变量的变化趋势,还能通过不同的样式配置,增强图表的可读性和美观度。在JVS-智能…

容器镜像仓库

文章目录 1、docker hub1_注册2_登录3_创建容器镜像仓库4_在本地登录Docker Hub5_上传容器镜像6_下载容器镜像 2、harbor1_获取 docker compose二进制文件2_获取harbor安装文件3_获取TLS文件4_修改配置文件5_执行预备脚本6_执行安装脚本7_验证运行情况8_访问harborUI界面9_harb…

网站打开速度测试工具:互联网优化的得力助手

在信息飞速流转的互联网时代,网站如同企业与用户对话的窗口,其打开速度直接关乎用户体验,乃至业务的成败。所幸,一系列专业的网站打开速度测试工具应运而生,它们宛如幕后的技术侦探,精准剖析网站性能&#…

liunx docker 部署 nacos seata sentinel

部署nacos 1.按要求创建好数据库 2.创建docker 容器 docker run -d --name nacos-server -p 8848:8848 -e MODEstandalone -e SPRING_DATASOURCE_PLATFORMmysql -e MYSQL_SERVICE_HOST172.17.251.166 -e MYSQL_SERVICE_DB_NAMEry-config -e MYSQL_SERVICE_PORT3306 -e MYSQL…

PHP 与 MySQL 搭配的优势

一、PHP 与 MySQL 搭配的优势 强大的动态网页开发能力 PHP 是一种服务器端脚本语言,能够生成动态网页内容。它可以根据用户的请求、数据库中的数据等因素,实时地生成 HTML 页面返回给客户端浏览器。而 MySQL 是一个流行的关系型数据库管理系统&#xf…

爬虫项目基础知识详解

文章目录 Python爬虫项目基础知识一、爬虫与数据分析1.1 Python中的requests库Requests 库的安装Requests 库的 get() 方法爬取网页的通用代码框架HTTP 协议及 Requests 库方法Requests 库主要方法解析 1.2 python中的json库1.3 xpath学习之python中lxml库html了解html结构html…

结构型-组合模式(Composite Pattern)

什么是组合模式 又名部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。 结构 抽象根节点(Co…

防止浏览器控制台修改网页数据与函数的方法

最近,解决了一个网络视频学习的两个问题:过10分钟就暂停并显示提示窗口、不能自动跳到下个章节,思路是:在控制台上运行一段编写的脚本代码,重定义该网页上一个函数(解决人工确认问题)&#xff1…

Wordpress设置固定链接形式后出现404错误

比如固定连接设置为 /archives/%post_id%.html 这种形式,看起来比较舒服。对搜索引擎也友好。 出现404需要设置伪静态

小程序项目的基本组成结构

分类介绍 项目根目录下的文件及文件夹 pages文件夹 用来存放所有小程序的页面,其中每个页面都由4个基本文件组成,它们分别是: .js文件:页面的脚本文件,用于存放页面的数据、事件处理函数等 .json文件:…

什么是Bug,bug怎么提交

1 bug的定义与起源 Bug在计算机科学中通常指的是程序或系统中的错误或缺陷,导致其无法按预期执行。这种错误可能源于代码中的逻辑错误、输入输出的意外处理、资源分配不当等问题。Bug的产生与多方面因素有关,包括程序员未能正确实现软件的特定规格或设定…

Agent AI: Surveying the Horizons of Multimodal Interaction---摘要、引言、代理 AI 集成

题目 智能体AI:多模态交互视野的考察 论文地址:https://arxiv.org/abs/2401.03568 图1:可以在不同领域和应用程序中感知和行动的Agent AI系统概述。Agent AI是正在成为通用人工智能(AGI)的一个有前途的途径。Agent AI培训已经证…

前端开发入门指南Day 17:TypeScript高级类型(泛型,类型守卫,Partial<T>和 Required<T>等)

泛型:代码的"变色龙" 🦎 为什么需要泛型? 想象一个快递员,每天要处理不同类型的包裹。如果为每种类型的包裹都写一套处理程序,那会很麻烦。泛型就像是一个"通用的包裹处理系统",它能…

LRU Cache替换算法

目录 1.什么是LRU Cache? 2.LRU Cache 的底层结构 3.LRU Cache的实现 LRUCache类中的接口总览 构造函数 get操作 put操作 打印 4.LRU Cache的测试 5.LRU Cache相关OJ题 6.LRU Cache类代码附录 1.什么是LRU Cache? 首先我想解释一下什么是cach…

小米二面:JVM 触发类加载的条件有哪些?

类加载生命周期 类加载的生命周期包括:加载(Loading)、链接(Linking) 和 初始化(Initialization)。而其中,初始化阶段是决定类是否被真正加载的关键。 JVM 在什么时候启动类加载过…

数字孪生与大型模型强强联合,共塑工业制造崭新前景

随着新一代信息技术与实体经济的加速融合,工业领域的数字化、智能化转型趋势愈发显著,孕育出一系列制造业数字化转型的新模式与新业态。在此背景下,数字孪生技术作为关键支撑力量,正在全球范围内迅速崛起并得到广泛应用&#xff0…

【笔记2-5】ESP32:freertos消息队列

主要参考b站宸芯IOT老师的视频,记录自己的笔记,老师讲的主要是linux环境,但配置过程实在太多问题,就直接用windows环境了,老师也有讲一些windows的操作,只要代码会写,操作都还好,开发…

Qt Chart 模块化封装曲线图

一 版本说明 二 完成示例 此文章包含:曲线轴设置,曲线切换,单条曲线显示,坐标轴。。。 三 曲线图UI创建 在UI界面拖放一个QWidget,然后在 Widget里面放一个 graphicsView 四 代码介绍 1 头文件 #include <QString> #include <QTimer> #include <QMessa…