Hive-2.HiveQL查询中ORDER BY 和SORT BY 语句|包含SORT BY 的DISTRIBUTE BY|CLUSTER BY

2023-11-29 04:08

本文主要是介绍Hive-2.HiveQL查询中ORDER BY 和SORT BY 语句|包含SORT BY 的DISTRIBUTE BY|CLUSTER BY,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. ORDER BY SORT BY 语句

order by 会对输入做全局排序,因此只有一个reducer(多个reducer无法保证全局有序)
只有一个reducer,会导致当输入规模较大时,需要较长的计算时间。

 

sort by不是全局排序,其在数据进入reducer前完成排序.因此,如果用sort by进行排序,并且设置mapred.reduce.tasks>1, 则sort by只保证每个reducer的输出有序,不保证全局有序。

 

l order by : 全局排序,启动一个reducer进行处理。

l sort by :局部排序,启动多个reducer进行处理,一般业务都是获取topN的排名,一般可以使用sort by进行局部排序,在通过limit n对局部结果进行汇总

Hive提供了关键字limit,在可以获取topN,获取网站页面访问的top10的实现方案:

通过一下方案,我们可以发现order by 启动两个jobsort by 启动3jobsort by可以启动多个reduce,每个reduce做局部排序,但是这对于sort by limit N已经够用了

方案1: 使用order by 进行排序

select * from (

select referrerpage ,count(1) refer_count from data_collect  group by referrerpage 

) t

order  by refer_count desc limit 10;

 

结果:

t.referrerpage  t.refer_count

http%3A//jf.10086.cn/   4714

http%3A//jf.10086.cn/portal/ware/web/SearchWareAction%3Faction%3DsearchMyExchangeWareInfo       1684

http%3A//jf.10086.cn/index.html 1171

http%3A//jf.10086.cn/portal/ware/web/SearchWareAction%3Faction%3DsearchWareInfo%26pager.offset%3D12     923

http%3A//jf.10086.cn/portal/ware/web/SearchWareAction%3Faction%3DsearchMyExchangeWareInfo%26pager.offset%3D12   794

http%3A//jf.10086.cn/ware/allClass.jsp  699

http%3A//jf.10086.cn/portal/ware/web/SearchWareAction%3Faction%3DsearchWareInfo%26pager.offset%3D24     685

http%3A//jf.10086.cn/portal/order/web/UserOrderAction%3Faction%3DdirectExchangeWare     680

http%3A//jf.10086.cn/rank/0_0_0_0.html  673

 

日志分析:

hive (jfyun)> select * from (

            > select referrerpage ,count(1) refer_count from data_collect  group by referrerpage 

            > ) t

            > order  by refer_count desc limit 10;

Automatically selecting local only mode for query

Total jobs = 2

 

Launching Job 1 out of 2

Number of reduce tasks not specified. Estimated from input data size: 1

In order to change the average load for a reducer (in bytes):

  set hive.exec.reducers.bytes.per.reducer=<number>

In order to limit the maximum number of reducers:

  set hive.exec.reducers.max=<number>

In order to set a constant number of reducers:

  set mapreduce.job.reduces=<number>

Job running in-process (local Hadoop)

Hadoop job information for null: number of mappers: 0; number of reducers: 0

2016-01-06 21:08:49,862 null map = 0%,  reduce = 0%

2016-01-06 21:08:53,345 null map = 100%,  reduce = 0%

2016-01-06 21:08:54,462 null map = 100%,  reduce = 100%

Ended Job = job_local785531207_0001

Execution completed successfully

MapredLocal task succeeded

 

Launching Job 2 out of 2

Number of reduce tasks determined at compile time: 1

In order to change the average load for a reducer (in bytes):

  set hive.exec.reducers.bytes.per.reducer=<number>

In order to limit the maximum number of reducers:

  set hive.exec.reducers.max=<number>

In order to set a constant number of reducers:

  set mapreduce.job.reduces=<number>

 

Job running in-process (local Hadoop)

Hadoop job information for null: number of mappers: 0; number of reducers: 0

2016-01-06 21:09:03,129 null map = 0%,  reduce = 0%

2016-01-06 21:09:04,385 null map = 100%,  reduce = 0%

2016-01-06 21:09:05,459 null map = 100%,  reduce = 100%

Ended Job = job_local127113388_0001

Execution completed successfully

MapredLocal task succeeded

OK

 

方案2: 使用sort by 进行排序

select * from (

select referrerpage ,count(1) refer_count from data_collect  group by referrerpage 

) t

sort by refer_count desc limit 10;

 

 

结果:

t.referrerpage  t.refer_count

http%3A//jf.10086.cn/   4714

http%3A//jf.10086.cn/portal/ware/web/SearchWareAction%3Faction%3DsearchMyExchangeWareInfo       1684

http%3A//jf.10086.cn/index.html 1171

http%3A//jf.10086.cn/portal/ware/web/SearchWareAction%3Faction%3DsearchWareInfo%26pager.offset%3D12     923

http%3A//jf.10086.cn/portal/ware/web/SearchWareAction%3Faction%3DsearchMyExchangeWareInfo%26pager.offset%3D12   794

http%3A//jf.10086.cn/ware/allClass.jsp  699

http%3A//jf.10086.cn/portal/ware/web/SearchWareAction%3Faction%3DsearchWareInfo%26pager.offset%3D24     685

http%3A//jf.10086.cn/portal/order/web/UserOrderAction%3Faction%3DdirectExchangeWare     680

http%3A//jf.10086.cn/rank/0_0_0_0.html  673

 

日志分析:

hive (jfyun)> select * from (

            > select referrerpage ,count(1) refer_count from data_collect  group by referrerpage 

            > ) t

            > sort by refer_count desc limit 10;

Automatically selecting local only mode for query

Total jobs = 3

 

Launching Job 1 out of 3

Number of reduce tasks not specified. Estimated from input data size: 1

In order to change the average load for a reducer (in bytes):

  set hive.exec.reducers.bytes.per.reducer=<number>

In order to limit the maximum number of reducers:

  set hive.exec.reducers.max=<number>

In order to set a constant number of reducers:

  set mapreduce.job.reduces=<number>

 

Job running in-process (local Hadoop)

Hadoop job information for null: number of mappers: 0; number of reducers: 0

2016-01-06 21:12:28,743 null map = 0%,  reduce = 0%

2016-01-06 21:12:32,163 null map = 100%,  reduce = 0%

2016-01-06 21:12:33,285 null map = 100%,  reduce = 100%

Ended Job = job_local1285072626_0001

Execution completed successfully

MapredLocal task succeeded

Launching Job 2 out of 3

 

Number of reduce tasks not specified. Estimated from input data size: 1

In order to change the average load for a reducer (in bytes):

  set hive.exec.reducers.bytes.per.reducer=<number>

In order to limit the maximum number of reducers:

  set hive.exec.reducers.max=<number>

In order to set a constant number of reducers:

  set mapreduce.job.reduces=<number>

Job running in-process (local Hadoop)

Hadoop job information for null: number of mappers: 0; number of reducers: 0

2016-01-06 21:12:43,206 null map = 0%,  reduce = 0%

2016-01-06 21:12:44,397 null map = 100%,  reduce = 0%

2016-01-06 21:12:45,518 null map = 100%,  reduce = 100%

Ended Job = job_local1012382962_0001

Execution completed successfully

MapredLocal task succeeded

Launching Job 3 out of 3

 

Number of reduce tasks determined at compile time: 1

In order to change the average load for a reducer (in bytes):

  set hive.exec.reducers.bytes.per.reducer=<number>

In order to limit the maximum number of reducers:

  set hive.exec.reducers.max=<number>

In order to set a constant number of reducers:

  set mapreduce.job.reduces=<number>

 

Job running in-process (local Hadoop)

Hadoop job information for null: number of mappers: 0; number of reducers: 0

2016-01-06 21:12:53,969 null map = 100%,  reduce = 100%

Ended Job = job_local931416756_0001

Execution completed successfully

MapredLocal task succeede

 

2. 包含SORT BY DISTRIBUTE BY

distribute by按照指定的字段对数据进行划分到不同的输出reduce / 文件中,根据map函数输出的key通过hash函数计算哈希数值,然后得到的哈希数值将键-值对均匀分发到多个reduer中去。

 

需求:获取每个商品类别和国家下的商品个数,并按照商品类别和国家下的商品销售取前三名。

数据:

类别 国家 商品名称 销售数量

movies us movies_us_1 100

movies us movies_us_2 150

movies us movies_us_3 200

movies us movies_us_4 300

movies gb movies_gb_1 100

movies gb movies_gb_2 150

movies gb movies_gb_3 200

movies gb movies_gb_4 300

office gb office_gb_1 30

office gb office_gb_2 40

office gb office_gb_3 50

office gb office_gb_4 60

office us office_us_1 30

office us office_us_2 50

office us office_us_3 60

office us office_us_4 70

数据表

create external table p_rank_demo(category string,country string,product string,sales int) row format delimited fields terminated by '\t';

 

加载数据

load data local inpath '/home/hadoop/p_rank_demo' overwrite into table p_rank_demo;

 

按照商品类别和国家下的商品销售排名(按照category,country分组,并通过sort by每个分组的结果排序)

select  category,country,product, sales,rank() over(distribute by category,country sort by category,country, sales desc)  as rk from p_rank_demo;

 

或者通过

select  category,country,product, sales,rank() over(partition by category,country order by sales desc)  as rk from p_rank_demo;

 

输出通过的结果(两者的区别: distribute by 具有相同的类别和国家的记录都发送到同一个reducer上,这样就可以统计

出每个类别和国家的销售商品的排名了。若业务是全局排序,可以通过partition by order by 获取排名。)

category        country product sales   rk

movies  gb      movies_gb_4     300     1

movies  gb      movies_gb_3     200     2

movies  gb      movies_gb_2     150     3

movies  gb      movies_gb_1     100     4

movies  us      movies_us_4     300     1

movies  us      movies_us_3     200     2

movies  us      movies_us_1     100     3

movies  us      movies_us_2     100     3

office  gb      office_gb_4     60      1

office  gb      office_gb_3     50      2

office  gb      office_gb_2     40      3

office  gb      office_gb_1     30      4

office  us      office_us_4     70      1

office  us      office_us_3     60      2

office  us      office_us_2     50      3

office  us      office_us_1     30      4

 

按照商品类别和国家下的商品销售排名前三输出

select * from (select  category,country,product, sales,rank() over(distribute by category,country sort by category,country, sales desc)  as rk from p_rank_demo) t where t.rk <= 3;

 

输出结果:

t.category      t.country       t.product       t.sales t.rk

movies  gb      movies_gb_4     300     1

movies  gb      movies_gb_3     200     2

movies  gb      movies_gb_2     150     3

movies  us      movies_us_4     300     1

movies  us      movies_us_3     200     2

movies  us      movies_us_1     100     3

movies  us      movies_us_2     100     3

office  gb      office_gb_4     60      1

office  gb      office_gb_3     50      2

office  gb      office_gb_2     40      3

office  us      office_us_4     70      1

office  us      office_us_3     60      2

office  us      office_us_2     50      3

 

3. CLUSTER BY 

使用distribute  by  A  sort by A 语句同cluster by A语句相同,即:分区和排序属于一个字段。但是cluster by 排序只能是倒序排序,不能指定排序规则为asc 或者desc

这篇关于Hive-2.HiveQL查询中ORDER BY 和SORT BY 语句|包含SORT BY 的DISTRIBUTE BY|CLUSTER BY的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/431388

相关文章

MySQL INSERT语句实现当记录不存在时插入的几种方法

《MySQLINSERT语句实现当记录不存在时插入的几种方法》MySQL的INSERT语句是用于向数据库表中插入新记录的关键命令,下面:本文主要介绍MySQLINSERT语句实现当记录不存在时... 目录使用 INSERT IGNORE使用 ON DUPLICATE KEY UPDATE使用 REPLACE

浅谈mysql的sql_mode可能会限制你的查询

《浅谈mysql的sql_mode可能会限制你的查询》本文主要介绍了浅谈mysql的sql_mode可能会限制你的查询,这个问题主要说明的是,我们写的sql查询语句违背了聚合函数groupby的规则... 目录场景:问题描述原因分析:解决方案:第一种:修改后,只有当前生效,若是mysql服务重启,就会失效;

MySQL多列IN查询的实现

《MySQL多列IN查询的实现》多列IN查询是一种强大的筛选工具,它允许通过多字段组合快速过滤数据,本文主要介绍了MySQL多列IN查询的实现,具有一定的参考价值,感兴趣的可以了解一下... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析与优化1.

python之流程控制语句match-case详解

《python之流程控制语句match-case详解》:本文主要介绍python之流程控制语句match-case使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录match-case 语法详解与实战一、基础值匹配(类似 switch-case)二、数据结构解构匹

mybatis-plus 实现查询表名动态修改的示例代码

《mybatis-plus实现查询表名动态修改的示例代码》通过MyBatis-Plus实现表名的动态替换,根据配置或入参选择不同的表,本文主要介绍了mybatis-plus实现查询表名动态修改的示... 目录实现数据库初始化依赖包配置读取类设置 myBATis-plus 插件测试通过 mybatis-plu

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

《MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固通俗易懂版)》本文主要讲解了MySQL中的多表查询,包括子查询、笛卡尔积、自连接、多表查询的实现方法以及多列子查询等,通过实际例子和操... 目录复合查询1. 回顾查询基本操作group by 分组having1. 显示部门号为10的部门名,员

mysql关联查询速度慢的问题及解决

《mysql关联查询速度慢的问题及解决》:本文主要介绍mysql关联查询速度慢的问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql关联查询速度慢1. 记录原因1.1 在一次线上的服务中1.2 最终发现2. 解决方案3. 具体操作总结mysql

mysql线上查询之前要性能调优的技巧及示例

《mysql线上查询之前要性能调优的技巧及示例》文章介绍了查询优化的几种方法,包括使用索引、避免不必要的列和行、有效的JOIN策略、子查询和派生表的优化、查询提示和优化器提示等,这些方法可以帮助提高数... 目录避免不必要的列和行使用有效的JOIN策略使用子查询和派生表时要小心使用查询提示和优化器提示其他常

grom设置全局日志实现执行并打印sql语句

《grom设置全局日志实现执行并打印sql语句》本文主要介绍了grom设置全局日志实现执行并打印sql语句,包括设置日志级别、实现自定义Logger接口以及如何使用GORM的默认logger,通过这些... 目录gorm中的自定义日志gorm中日志的其他操作日志级别Debug自定义 Loggergorm中的

SQL 中多表查询的常见连接方式详解

《SQL中多表查询的常见连接方式详解》本文介绍SQL中多表查询的常见连接方式,包括内连接(INNERJOIN)、左连接(LEFTJOIN)、右连接(RIGHTJOIN)、全外连接(FULLOUTER... 目录一、连接类型图表(ASCII 形式)二、前置代码(创建示例表)三、连接方式代码示例1. 内连接(I