Hive中的排序语法 2014.06.22
ORDER BY
hive中的ORDER BY语句和关系数据库中的sql语法相似。他会对查询结果做全局排序,这意味着所有的数据会传送到一个Reduce任务上,这样会导致在大数量的情况下,花费大量时间。
与数据库中 ORDER BY 的区别在于在hive.mapred.mode = strict
模式下,必须指定 limit 否则执行会报错。
hive> set hive.mapred.mode=strict;
hive> select * from test order by id;
FAILED: SemanticException 1:28 In strict mode, if ORDER BY is specified, LIMIT must also be specified. Error encountered near token 'id'
例子:
hive> set hive.mapred.mode=unstrict;
hive> select * from test order BY id ;
MapReduce Jobs Launched:
Job 0: Map: 1 Reduce: 1 Cumulative CPU: 1.88 sec HDFS Read: 305 HDFS Write: 32 SUCCESS
Total MapReduce CPU Time Spent: 1 seconds 880 msec
OK
1 a
1 a
2 b
2 b
3 c
3 c
4 d
4 d
Time taken: 24.609 seconds, Fetched: 8 row(s)
从上面的日志可以看到:启动了一个reduce进行全局排序。
SORT BY
SORT BY不是全局排序,其在数据进入reducer前完成排序,因此在有多个reduce任务情况下,SORT BY只能保证每个reduce的输出有序,而不能保证全局有序。
注意:SORT BY 不受
hive.mapred.mode
参数的影响
你可以通过设置mapred.reduce.tasks
的值来控制reduce的数,然后对reduce输出的结果做二次排序。
例子:
hive> set mapred.reduce.tasks=3;
hive> select * from test sort BY id ;
MapReduce Jobs Launched:
Job 0: Map: 1 Reduce: 3 Cumulative CPU: 4.48 sec HDFS Read: 305 HDFS Write: 32 SUCCESS
Total MapReduce CPU Time Spent: 4 seconds 480 msec
OK
1 a
2 b
3 c
4 d
2 b
3 c
4 d
1 a
Time taken: 29.574 seconds, Fetched: 8 row(s)
从上面的日志可以看到:启动了三个reduce分别排序,最后的结果不是有序的。
DISTRIBUTE BY with SORT BY
DISTRIBUTE BY能够控制map的输出在reduce中如何划分。其可以按照指定的字段对数据进行划分到不同的输出reduce/文件中。
DISTRIBUTE BY和GROUP BY有点类似,DISTRIBUTE BY控制reduce如何处理数据,而SORT BY控制reduce中的数据如何排序。
注意:hive要求DISTRIBUTE BY语句出现在SORT BY语句之前。
例子:
hive> select * from test distribute BY id sort by id asc;
Job 0: Map: 1 Reduce: 3 Cumulative CPU: 4.24 sec HDFS Read: 305 HDFS Write: 32 SUCCESS
Total MapReduce CPU Time Spent: 4 seconds 240 msec
OK
3 c
3 c
1 a
1 a
4 d
4 d
2 b
2 b
Time taken: 29.89 seconds, Fetched: 8 row(s)
从上面的日志可以看到:启动了三个reduce分别排序,最后的结果不是有序的。
CLUSTER BY来代替
当DISTRIBUTE BY的字段和SORT BY的字段相同时,可以用CLUSTER BY来代替 DISTRIBUTE BY with SORT BY。
注意:CLUSTER BY不能添加desc或者asc。
例子:
hive> select * from test cluster by id asc;
FAILED: ParseException line 1:33 extraneous input 'asc' expecting EOF near '<EOF>'
hive> select * from test cluster by id ;
MapReduce Jobs Launched:
Job 0: Map: 1 Reduce: 3 Cumulative CPU: 4.58 sec HDFS Read: 305 HDFS Write: 32 SUCCESS
Total MapReduce CPU Time Spent: 4 seconds 580 msec
OK
3 c
3 c
1 a
1 a
4 d
4 d
2 b
2 b
Time taken: 30.646 seconds, Fetched: 8 row(s)
从上面的日志可以看到:启动了三个reduce分别排序,最后的结果不是有序的。
怎样让最后的结果是有序的呢?
可以这样做:
hive> select a.* from (select * from test cluster by id ) a order by a.id ;
MapReduce Jobs Launched:
Job 0: Map: 1 Reduce: 3 Cumulative CPU: 4.5 sec HDFS Read: 305 HDFS Write: 448 SUCCESS
Job 1: Map: 1 Reduce: 1 Cumulative CPU: 1.96 sec HDFS Read: 1232 HDFS Write: 32 SUCCESS
Total MapReduce CPU Time Spent: 6 seconds 460 msec
OK
1 a
1 a
2 b
2 b
3 c
3 c
4 d
4 d
Time taken: 118.261 seconds, Fetched: 8 row(s)
总结
- ORDER BY是全局排序,但在数据量大的情况下,花费时间会很长
- SORT BY是将reduce的单个输出进行排序,不能保证全局有序
- DISTRIBUTE BY可以按指定字段将数据划分到不同的reduce中
- 当DISTRIBUTE BY的字段和SORT BY的字段相同时,可以用CLUSTER BY来代替 DISTRIBUTE BY with SORT BY。
本方转自:http://blog.javachen.com/2014/06/22/sort-in-hive-query/
相关推荐
Hive 还提供了 Oracle SQL 对应的 HSQL 语法支持,允许用户使用 Oracle SQL 语句在 Hive 中执行。这个支持包括: * FROM 语句:用于指定数据表的来源。 * WHERE 语句:用于指定数据的过滤条件。 * GROUP BY 语句:...
Hive 语法总结 Hive 语法总结是一种基于 Hadoop 的数据仓库工具,它提供了类似 SQL 的查询语言,用于处理和分析大规模数据。下面是 Hive 语法总结的知识点: 1. SELECT 语句 Hive 的 SELECT 语句结构如下: ...
Hive SQL 语法大全是 Hive 中的 SQL 语法说明,涵盖了数据库操作、表操作、数据类型等方面的知识点。 一、数据库操作 1. 创建数据库:CREATE DATABASE [IF NOT EXISTS] db_name [LOCATION 'path'] [COMMENT ...
Hive作为一款基于Hadoop的数据仓库工具,为用户提供了一种类似SQL的查询语言——HiveQL,使得数据分析师能用熟悉的SQL语言去操作存储在Hadoop文件系统中的大数据。HiveQL支持绝大部分标准SQL语法,其中包括DDL(数据...
"Hive语法和常用函数" Hive是基于Hadoop分布式系统上的数据仓库,最早是由Facebook公司开发的,Hive极大的推进了Hadoop ecosystem在数据仓库方面上的发展。Facebook的分析人员中很多工程师比较擅长SQL而不善于开发...
### Hive SQL语法详解 #### 一、Hive简介与特性 Hive是一个建立在Hadoop之上的数据仓库工具,主要用于对存储在Hadoop文件系统(HDFS)中的数据进行数据分析和处理。它提供了类似SQL的查询语言——Hive SQL,使得...
在本主题中,我们将深入探讨Hive的基本语法及其使用。 1. **Hive安装与配置**: 在使用Hive之前,首先需要在系统上安装并配置Hadoop环境,因为Hive依赖于Hadoop的分布式文件系统(HDFS)。接着,安装Hive,并在`...
- **Hive程序的执行过程**: 包括词法语法解析、生成抽象语法树、代码生成等。 - **Hive的元数据存储**: 存储在关系型数据库中,如MySQL。 - **Hive客户端**: 提供与用户的接口,如命令行界面(CLI)、Web界面等。...
Hive 语法和常用函数 Hive 是一个基于 Hadoop 分布式系统上的数据仓库,最初由 Facebook 公司开发的,极大地推进了 Hadoop 生态系统在数据仓库方面的发展。 Hive 提供了一种 SQL-like 的语言,称为 Hive QL,用于...
Hive语法和常用函数 Hive是一个基于Hadoop分布式系统上的数据仓库,由Facebook公司开发的,Hive极大的推进了Hadoop ecosystem在数据仓库方面上的发展。Hive提供了数据仓库的部分功能,包括数据ETL(抽取、转换、...
本教程将深入探讨Hive数仓的架构与设计,Hive SQL的基本语法及高级特性,以及如何自定义函数以满足特定需求,并详细解析Hive的重要参数配置。 1. Hive数仓: - 数据仓库概念:数据仓库是为决策支持系统设计的,...
创建数据库是 Hive 中最基本的操作之一。Hive 中的数据库是一个命名空间或表的集合。使用 CREATE DATABASE 语句可以创建数据库。在 Hive 中,配置单元包含一个名为 default 的默认数据库。CREATE DATABASE 语句的...
Hive是大数据领域中一个重要的数据仓库工具,它设计的目标是为大规模数据集提供数据查询和分析能力。由于Hive提供了类似SQL的查询语言(HQL),使得非Java背景的分析师也能轻松进行大数据处理。下面我们将深入探讨...
- `LOAD DATA INPATH 'path' [OVERWRITE] INTO TABLE table_name [PARTITION (partition_spec)]`用于将HDFS中的数据加载到Hive表中。 **2.6 插入数据** - **将数据插入到Hive表**:可以使用`INSERT INTO TABLE ...
- **Phase1 SQL词法,语法解析**:Hive使用Antlr工具解析SQL,生成抽象语法树(AST Tree)。Antlr是一个强大的解析工具,能够解析特定的语言结构,如HiveQL。 - **Phase2 AST Tree到QueryBlock**:接下来,Hive...
基本语法包括:CREATE TABLE用于创建表,LOAD DATA用于加载数据,SELECT用于查询,JOIN用于连接多个表,WHERE用于条件筛选,GROUP BY和HAVING用于分组和过滤,ORDER BY和DISTRIBUTE BY用于排序和分布数据。...
Hive 窗口函数是 Hive 中的一种强大的分析函数,它可以对数据进行分类、排序、聚合和排名等操作。下面将详细介绍 Hive 窗口函数的语法结构、分类、应用场景和实践练习。 窗口函数语法结构 窗口函数的基本语法结构...
2.1.2 语法 12 2.1.3 基本例子 14 2.1.4 创建分区 15 2.1.5 其它例子 16 2.2 Alter Table 17 2.2.1 Add Partitions 17 2.2.2 Drop Partitions 17 2.2.3 Rename Table 17 2.2.4 Change Column 18 2.2.5 Add/Replace ...
Hive 是一个构建于 Hadoop 之上的数据仓库工具,它提供了类 SQL 的查询语言(HQL),使得用户可以方便地处理存储在 Hadoop 分布式文件系统(HDFS)中的大规模数据集。Hive 的设计初衷在于降低大数据处理的门槛,让...