【Hive】笔试题 03 (求每一年最大气温的那一天 + 温度)

1、说明

具体数据

2014010216
2014010410
2012010609
2012010812
2012011023
2001010212
2001010411
2013010619
2013010812
2013011023
2008010216
2008010414
2007010619
2007010812
2007011023
2010010216
2010010410
2015010649
2015010812
2015011023

数据解释

2010012325表示在20100123日的气温为25

2、 需求

比如:2010012325表示在2010年01月23日的气温为25度。现在要求使用hive,计算每一年出现过的最大气温的日期+温度。
要计算出每一年的最大气温。我用
select substr(data,1,4),max(substr(data,9,2)) from table2 group by substr(data,1,4);
出来的是 年份 + 温度 这两列数据例如 2015 99

但是如果我是想select 的是:具体每一年最大气温的那一天 + 温度 。例如 20150109 99
请问该怎么执行hive语句。
group by 只需要substr(data,1,4),
但是select substr(data,1,8),又不在group by 的范围内。
是我陷入了思维死角。一直想不出所以然。求大神指点一下。
在select 如果所需要的。不在group by的条件里。这种情况如何去分析?

3、解析

(1)创建一个临时表tmp_weather,将数据切分

create table tmp_weather as 
select substr(data,1,4) years,substr(data,5,2) months,substr(data,7,2) days,substr(data,9,2) temp from weather;
select * from tmp_weather;
+--------------------+---------------------+-------------------+-------------------+--+
| tmp_weather.years  | tmp_weather.months  | tmp_weather.days  | tmp_weather.temp  |
+--------------------+---------------------+-------------------+-------------------+--+
| 2014               | 01                  | 02                | 16                |
| 2014               | 01                  | 04                | 10                |
| 2012               | 01                  | 06                | 09                |
| 2012               | 01                  | 08                | 12                |
| 2012               | 01                  | 10                | 23                |
| 2001               | 01                  | 02                | 12                |
| 2001               | 01                  | 04                | 11                |
| 2013               | 01                  | 06                | 19                |
| 2013               | 01                  | 08                | 12                |
| 2013               | 01                  | 10                | 23                |
| 2008               | 01                  | 02                | 16                |
| 2008               | 01                  | 04                | 14                |
| 2007               | 01                  | 06                | 19                |
| 2007               | 01                  | 08                | 12                |
| 2007               | 01                  | 10                | 23                |
| 2010               | 01                  | 02                | 16                |
| 2010               | 01                  | 04                | 10                |
| 2015               | 01                  | 06                | 49                |
| 2015               | 01                  | 08                | 12                |
| 2015               | 01                  | 10                | 23                |
+--------------------+---------------------+-------------------+-------------------+--+

(2)创建一个临时表tmp_year_weather

create table tmp_year_weather as 
select substr(data,1,4) years,max(substr(data,9,2)) max_temp from weather group by substr(data,1,4);
select * from tmp_year_weather;
+-------------------------+----------------------------+--+
| tmp_year_weather.years  | tmp_year_weather.max_temp  |
+-------------------------+----------------------------+--+
| 2001                    | 12                         |
| 2007                    | 23                         |
| 2008                    | 16                         |
| 2010                    | 16                         |
| 2012                    | 23                         |
| 2013                    | 23                         |
| 2014                    | 16                         |
| 2015                    | 49                         |
+-------------------------+----------------------------+--+

(3)将2个临时表进行连接查询

select * from tmp_year_weather a join tmp_weather b on a.years=b.years and a.max_temp=b.temp;
+----------+-------------+----------+-----------+---------+---------+--+
| a.years  | a.max_temp  | b.years  | b.months  | b.days  | b.temp  |
+----------+-------------+----------+-----------+---------+---------+--+
| 2014     | 16          | 2014     | 01        | 02      | 16      |
| 2012     | 23          | 2012     | 01        | 10      | 23      |
| 2001     | 12          | 2001     | 01        | 02      | 12      |
| 2013     | 23          | 2013     | 01        | 10      | 23      |
| 2008     | 16          | 2008     | 01        | 02      | 16      |
| 2007     | 23          | 2007     | 01        | 10      | 23      |
| 2010     | 16          | 2010     | 01        | 02      | 16      |
| 2015     | 49          | 2015     | 01        | 06      | 49      |
+----------+-------------+----------+-----------+---------+---------+--+

4、其他方法

使用了窗口函数,可以看出还是非常迅速的!

select data from (
select data, rank() over (partition by substr(data, 0,4) order by substr(data, 9,10) desc) as rn from weather order by data) as temp
where temp.rn = 1;
+-------------+--+
|    data     |
+-------------+--+
| 2001010212  |
| 2007011023  |
| 2008010216  |
| 2010010216  |
| 2012011023  |
| 2013011023  |
| 2014010216  |
| 2015010649  |
+-------------+--+

也看到了其他朋友的方法,嗯,操作大同小异,这里给大家看下:

存原数据
create table tempertrue(
data string commentrow data);
视图切分日期与温度:
create view temp as select substr(data,1,8) as time,substr(data,9) as tep from tempertrue;
分区排序再筛选:
select time,tep from (select time,tep,rank() over(partition by substr(time,1,4) order by tep desc) as num from temp) as t1 where t1.num=1;
同理,num=2可取第二高温度
  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
Hadoop和Hive是大数据处理领域中经常使用的工具和框架。 Hadoop是一个开源的分布式计算框架,旨在解决处理大规模数据的问题。它通过将大型数据集分布到多个计算机节点上,并利用集群中的多个计算资源进行并行计算和存储,从而实现高效地处理大数据。Hadoop包括Hadoop分布式文件系统(HDFS)和Hadoop资源调度器(YARN),它们共同构成了Hadoop的核心组件。HDFS负责将数据分布式存储到集群中的各个节点上,而YARN则负责管理集群中的资源和任务调度。Hadoop还提供了一个分布式计算编程模型MapReduce,用于编写并行计算任务。通过使用Hadoop,可以实现大规模数据的存储、处理和分析,从而提供有关数据的洞察力。 Hive是建立在Hadoop之上的数据仓库基础架构,它提供了一个类似于SQL的查询语言——HiveQL,用于将结构化数据映射到Hadoop分布式文件系统上,并提供高级查询和分析能力。Hive将用户提交的HiveQL查询转换为MapReduce任务,并在Hadoop集群上执行。Hive的设计目标是提供高效灵活的数据查询和分析解决方案,同时隐藏底层的复杂性。它支持用户自定义函数(UDF)、数据压缩和数据分区等功能,以及与其他工具(如Pig、Sqoop和Flume)的集成。通过使用Hive,用户可以方便地使用SQL语言进行数据的查询、过滤、转换和分析,而无需深入了解Hadoop的底层技术。 总结来说,Hadoop和Hive是大数据处理领域中非常重要的工具和框架。Hadoop提供了一个分布式计算和存储的平台,可用于处理大规模数据,而Hive则建立在Hadoop之上,提供了更高级的查询和分析能力,使用户可以通过类似SQL的语言对大数据进行查询和分析。这些工具的使用可以帮助用户更高效、方便地处理和分析大规模数据,并挖掘出有价值的信息。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值