在hive中不光有order by操作,还有个sort by操作。两者执行的都是排序的操作,但有存在很大的不同。
还是用上次order by的例子来说明。
测试用例
hive> select * from test09;
OK
100 tom
200 mary
300 kate
400 tim
Time taken: 0.061 seconds
hive> select * from test09 sort by id;
Total MapReduce jobs = 1
Launching Job 1 out of 1
Number of reduce tasks not specified. Defaulting to jobconf value of: 2
In order to change the average load for a reducer (in bytes):
set hive.exec.reducers.bytes.per.reducer=
In order to limit the maximum number of reducers:
set hive.exec.reducers.max=
In order to set a constant number of reducers:
set mapred.reduce.tasks=
Starting Job = job_201105020924_0068, Tracking URL = http://hadoop00:50030/jobdetails.jsp?jobid=job_201105020924_0068
Kill Command = /home/hjl/hadoop/bin/../bin/hadoop job -Dmapred.job.tracker=hadoop00:9001 -kill job_201105020924_0068
2011-05-03 05:39:21,389 Stage-1 map = 0%, reduce = 0%
2011-05-03 05:39:23,410 Stage-1 map = 50%, reduce = 0%
2011-05-03 05:39:25,430 Stage-1 map = 100%, reduce = 0%
2011-05-03 05:39:30,470 Stage-1 map = 100%, reduce = 50%
2011-05-03 05:39:32,493 Stage-1 map = 100%, reduce = 100%
Ended Job = job_201105020924_0068
OK
100 tom
300 kate
200 mary
400 tim
Time taken: 17.783 seconds
结果看起来和order by差不多,但是sort by是不受hive.mapred.mode参数影响,无论hive.mapred.mode在什么模式都可以。
从上面的Number of reduce tasks not specified. Defaulting to jobconf value of: 2可以看得出来,此时共启动了2个reduce。
实际上sort by可以控制每个reduce产生的文件都是排序的,这样对多个已经排序好的文件做一次归并排序就ok了。
比用order by的时候,仅仅有单个reduce要好得多。
我们把上面的结果写到文件中就看得清楚的多了。
hive> insert overwrite local directory ‘/home/hjl/sunwg/qqq’ select * from test09 sort by id;
Total MapReduce jobs = 1
Launching Job 1 out of 1
Number of reduce tasks not specified. Defaulting to jobconf value of: 2
In order to change the average load for a reducer (in bytes):
set hive.exec.reducers.bytes.per.reducer=
In order to limit the maximum number of reducers:
set hive.exec.reducers.max=
In order to set a constant number of reducers:
set mapred.reduce.tasks=
Starting Job = job_201105020924_0069, Tracking URL = http://hadoop00:50030/jobdetails.jsp?jobid=job_201105020924_0069
Kill Command = /home/hjl/hadoop/bin/../bin/hadoop job -Dmapred.job.tracker=hadoop00:9001 -kill job_201105020924_0069
2011-05-03 05:41:27,913 Stage-1 map = 0%, reduce = 0%
2011-05-03 05:41:30,939 Stage-1 map = 100%, reduce = 0%
2011-05-03 05:41:37,993 Stage-1 map = 100%, reduce = 50%
2011-05-03 05:41:41,023 Stage-1 map = 100%, reduce = 100%
Ended Job = job_201105020924_0069
Copying data to local directory /home/hjl/sunwg/qqq
Copying data to local directory /home/hjl/sunwg/qqq
4 Rows loaded to /home/hjl/sunwg/qqq
OK
Time taken: 18.496 seconds
[hjl@sunwg src]$ ll /home/hjl/sunwg/qqq
total 8
-rwxrwxrwx 1 hjl hjl 17 May 3 05:41 attempt_201105020924_0069_r_000000_0
-rwxrwxrwx 1 hjl hjl 17 May 3 05:41 attempt_201105020924_0069_r_000001_0
此时产生了2个文件,分别查看每个文件的内容。
[hjl@sunwg src]$ cat /home/hjl/sunwg/qqq/attempt_201105020924_0069_r_000000_0
100tom
300kate
[hjl@sunwg src]$ cat /home/hjl/sunwg/qqq/attempt_201105020924_0069_r_000001_0
200mary
400tim
可以看得出来每个文件的内部都是排好顺序的。
order by和sort by都可以实现排序的功能,不过具体怎么使用还得根据情况,如果数据量不是太大的情况可以使用order by,如果数据库过于庞大,最好还是使用sort by。
分享到:
相关推荐
hive的Order By/Sort By/Distribute By Join查询,join只支持等值连接 LEFT,RIGHT 和 FULL OUTER JOIN LEFT SEMI JOIN Hive当前没有实现 IN/EXISTS 子查询,可以用 LEFT SEMI JOIN 重写子查询语句。
而Client则是指Hive的Java客户端API,通过该API可以直接在应用程序中执行Hive SQL;WUI则提供了基于Web的用户界面,方便用户远程访问和管理Hive。 - **元数据存储**:Hive的元数据通常存储在关系型数据库中,如...
4. 分区和桶:通过PARTITION BY和CLUSTER BY/DISTRIBUTE BY/SORT BY优化查询性能。 5. 数据更新:Hive不支持行级别的插入和更新,但可以通过INSERT OVERWRITE重写整个表或分区。 五、Hive与Hadoop的协同工作 Hive...
- **DistributeBy和SortBy**: - 在MapReduce作业中控制数据的分布和排序方式。 - **ClusterBy**: - `SELECT * FROM table_name CLUSTER BY column_name;` - **常见全局排序需求**: - 在大型数据集中实现全局排序...
例如,HQL支持的聚合函数有COUNT、SUM、AVG、MAX、MIN等,同时还有GROUP BY、JOIN、DISTRIBUTE BY、SORT BY等操作。HQL还提供了窗口函数和自定义函数(UDFs)以增强其功能。 在Hive中,数据处理分为两个阶段:编译...
1. **全排序**:Hive 的 `SORT BY` 只能在单机范围内排序,而 `ORDER BY` 实现全局排序,需谨慎使用。 2. **笛卡尔积**:在严格模式下,Hive 不允许笛卡尔积,可以通过添加 Join Key 或使用 MapJoin 避免。 3. **...
- 排序操作(ORDER BY、SORT BY、DISTRIBUTE BY、CLUSTER BY); - 复合数据类型(ARRAY、MAP、STRUCT)的使用技巧。 5. **Hive高级特性** - 索引创建与管理; - HiveServer2/beeline的使用; - Java操作Hive...
使用`DISTRIBUTE BY`和`SORT BY`组合可以局部排序,提高效率。对于`DISTINCT`,可以考虑转换为`GROUP BY`。 4. **更换执行引擎**:默认的MapReduce执行引擎可能存在效率问题,可以切换到Tez、Spark或Flink。Tez利用...
6. 分组和排序:`GROUP BY`, `ORDER BY`, `DISTRIBUTE BY`, `SORT BY`,用于数据分组和排序。 7. 时间和日期函数:`YEAR`, `MONTH`, `DAY`, `HOUR`, `MINUTE`, `SECOND`,用于提取日期和时间部分。 8. 模式匹配函数...
19.Hive中order by、sort by、distribute by与cluster by的使用 20.Hive中分析函数与窗口函数 21.Hive中UDF的介绍 22.Hive中使用自定义UDF实现日期格式转换 23. HiveServer2的介绍及三种连接方式 24.Hive元数据、...
尽管Hive不支持传统的关系数据库中的索引,但有类似的概念如Bucketing和Sort/Clustered By,它们可以改善查询性能。 9. **Hive与MapReduce**:Hive的本质是将SQL查询转换为MapReduce作业进行执行,因此理解...
Hive的Select操作提供了GroupBy、Order和SortBy等查询功能,以支持数据的聚合与排序。Hive Join用于将两个或多个表的行联合起来,以获取所需的数据。 Hive的用户在使用时需要注意一些关键点,比如字符集的处理、...
- 使用`DISTRIBUTE BY`和`SORT BY`来重新分配数据。 - 对大表和小表做JOIN操作时,优先将小表广播到各个Reducer中。 ##### 2. 合理使用分区 - **问题**:不当的分区策略会导致查询效率低下。 - **解决方案**: ...
6. **使用索引**:虽然Hive的索引功能有限,但在某些场景下,例如优化join条件,使用bucketing和sort by可以提升性能。 7. **SQL语句优化**:避免使用子查询,使用连接(JOIN)代替子查询,合理使用WHERE和HAVING,...
3. **使用SORT BY替代ORDER BY**: - **全局排序**:ORDER BY会导致所有数据进入同一个Reduce任务中进行排序,适用于小数据量查询。 - **局部排序**:SORT BY可以在多个Reduce任务中进行局部排序,提高效率。 - *...
HQL中的JOIN操作、GROUP BY、SORT BY、DISTRIBUTE BY等语句都是为大数据场景定制的。 五、案例实践 1. 数据加载:使用LOAD DATA命令将本地文件系统或HDFS上的数据导入到Hive表中。 2. 表操作:创建表(CREATE TABLE...
3. SQL查询:掌握HQL(Hive Query Language)的基本操作,如SELECT、JOIN、GROUP BY、HAVING、窗口函数等。 4. 存储和文件格式:了解Hive支持的不同文件格式(如TextFile、Parquet、ORC、Avro),以及它们各自的优...
Hive提供了COUNT、SUM、AVG、MAX、MIN等聚合函数,以及GROUP BY、DISTRIBUTE BY、SORT BY等语句来实现这些统计。 6. **窗口函数**:对于时间序列分析,Hive的窗口函数(如ROW_NUMBER、LAG、LEAD、RANK等)能帮助...
- **分组与排序**:GROUP BY, ORDER BY, DISTRIBUTE BY, SORT BY等。 - **分区查询**:使用WHERE子句指定分区,如WHERE year=2020。 4. **优化技巧** - **分区优化**:通过合理分区减少扫描的数据量。 - **桶表...