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

相关文章

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

ural 1026. Questions and Answers 查询

1026. Questions and Answers Time limit: 2.0 second Memory limit: 64 MB Background The database of the Pentagon contains a top-secret information. We don’t know what the information is — you

Mybatis中的like查询

<if test="templateName != null and templateName != ''">AND template_name LIKE CONCAT('%',#{templateName,jdbcType=VARCHAR},'%')</if>

封装MySQL操作时Where条件语句的组织

在对数据库进行封装的过程中,条件语句应该是相对难以处理的,毕竟条件语句太过于多样性。 条件语句大致分为以下几种: 1、单一条件,比如:where id = 1; 2、多个条件,相互间关系统一。比如:where id > 10 and age > 20 and score < 60; 3、多个条件,相互间关系不统一。比如:where (id > 10 OR age > 20) AND sco

京东物流查询|开发者调用API接口实现

快递聚合查询的优势 1、高效整合多种快递信息。2、实时动态更新。3、自动化管理流程。 聚合国内外1500家快递公司的物流信息查询服务,使用API接口查询京东物流的便捷步骤,首先选择专业的数据平台的快递API接口:物流快递查询API接口-单号查询API - 探数数据 以下示例是参考的示例代码: import requestsurl = "http://api.tanshuapi.com/a

DAY16:什么是慢查询,导致的原因,优化方法 | undo log、redo log、binlog的用处 | MySQL有哪些锁

目录 什么是慢查询,导致的原因,优化方法 undo log、redo log、binlog的用处  MySQL有哪些锁   什么是慢查询,导致的原因,优化方法 数据库查询的执行时间超过指定的超时时间时,就被称为慢查询。 导致的原因: 查询语句比较复杂:查询涉及多个表,包含复杂的连接和子查询,可能导致执行时间较长。查询数据量大:当查询的数据量庞大时,即使查询本身并不复杂,也可能导致

【Python知识宝库】上下文管理器与with语句:资源管理的优雅方式

🎬 鸽芷咕:个人主页  🔥 个人专栏: 《C++干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 前言一、什么是上下文管理器?二、上下文管理器的实现三、使用内置上下文管理器四、使用`contextlib`模块五、总结 前言 在Python编程中,资源管理是一个重要的主题,尤其是在处理文件、网络连接和数据库

oracle11.2g递归查询(树形结构查询)

转自: 一 二 简单语法介绍 一、树型表结构:节点ID 上级ID 节点名称二、公式: select 节点ID,节点名称,levelfrom 表connect by prior 节点ID=上级节点IDstart with 上级节点ID=节点值 oracle官网解说 开发人员:SQL 递归: 在 Oracle Database 11g 第 2 版中查询层次结构数据的快速

ElasticSearch的DSL查询⑤(ES数据聚合、DSL语法数据聚合、RestClient数据聚合)

目录 一、数据聚合 1.1 DSL实现聚合 1.1.1 Bucket聚合  1.1.2 带条件聚合 1.1.3 Metric聚合 1.1.4 总结 2.1 RestClient实现聚合 2.1.1 Bucket聚合 2.1.2 带条件聚合 2.2.3 Metric聚合 一、数据聚合 聚合(aggregations)可以让我们极其方便的实现对数据的统计、分析、运算。例如: