1.现有这么一批数据,现要求出:每个用户截止到每月为止的最大单月访问次数和累计到该月的总访问次数

三个字段的意思:
用户名uid,月份month,访问次数count

A,2015-01,5
A,2015-01,15
B,2015-01,5
A,2015-01,8
B,2015-01,25
A,2015-01,5
A,2015-02,4
A,2015-02,6
B,2015-02,10
B,2015-02,5
A,2015-03,16
A,2015-03,22
B,2015-03,23
B,2015-03,10
B,2015-03,11

最后结果展示:

用户   月份      最大访问次数  总访问次数       当月访问次数
A   2015-01     33          33        33
A   2015-02     33          43        10
A   2015-03     38          81        38
B   2015-01     30          30        30
B   2015-02     30          45                15
B   2015-03     44          89        44

建表与导入数据

create table if not exists interview01(userId string,month string,count int) row format delimited fields terminated by ",";
load data local inpath "/home/hadoop/hive_data/interview01" into table interview01;

辅助SQL:

先按userid和month分组,求出总次数counts

select userid,month,sum(count)counts
from interview01
group by userid,month

最终SQL:

使用窗口函数求截止到当月的最大访问次数,直接从上表里面查

select userid,month,
max(counts) over(distribute by userid sort by month)maxcount,
sum(counts) over(distribute by userid sort by month)sumcount,counts
from
(select userid,month,sum(count)counts
from interview01
group by userid,month)tmp;

2.求:所有数学课程成绩 大于 语文课程成绩的学生的学号

// 建表语句:
CREATE TABLE `course` (`id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,`sid` int(11) DEFAULT NULL,`course` varchar(255) DEFAULT NULL,`score` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;// 插入数据
// 字段解释:id, 学号, 课程, 成绩
INSERT INTO `course` VALUES (1, 1, 'yuwen', 43);
INSERT INTO `course` VALUES (2, 1, 'shuxue', 55);
INSERT INTO `course` VALUES (3, 2, 'yuwen', 77);
INSERT INTO `course` VALUES (4, 2, 'shuxue', 88);
INSERT INTO `course` VALUES (5, 3, 'yuwen', 98);
INSERT INTO `course` VALUES (6, 3, 'shuxue', 65);

辅助SQL:

这题可以看做为一到mysql题,因为每个字段都只有一个成绩,所以这里我们要对没有的字段进行补0操作

select
sid,case course
when "yuwen" then score else 0 end yuwen,
case course when "shuxue" then score else 0 end shuxue
from course

然后我们从上表中操作语文和数学的最大值,然后作为一个表,直接进行查询

select
sid,shuxue,yuwen
from
(select
sid,sum(yuwen) yuwen,max(shuxue) shuxue
from
(select
sid,case course
when "yuwen" then score else 0 end yuwen,
case course when "shuxue" then score else 0 end shuxue
from course) a
group by sid) b where b.shuxue>b.yuwen;

结果

+------+--------+-------+
| sid  | shuxue | yuwen |
+------+--------+-------+
|    1 |     55 |    43 |
|    2 |     88 |    77 |
+------+--------+-------+

3.比如:2010012325表示在2010年01月23日的气温为25度。现在要求使用hive,
计算每一年出现过的最大气温的日期+温度。

2014010114
2014010216
2014010317
2014010410
2014010506
2012010609
2012010732
2012010812
2012010919
2012011023
2001010116
2001010212
2001010310
2001010411
2001010529
2013010619
2013010722
2013010812
2013010929
2013011023
2008010105
2008010216
2008010337
2008010414
2008010516
2007010619
2007010712
2007010812
2007010999
2007011023
2010010114
2010010216
2010010317
2010010410
2010010506
2015010649
2015010722
2015010812
2015010999
2015011023

建表与导入数据

create table if not exists interview03(data string);
load data local inpath "/home/hadoop/hive_data/interview03" into table interview03;

辅助SQL:

先求每一年的最大温度

select
substr(data,1,4) year,max(cast(substr(data,-2,2) as int))
max_temp
from interview03
group by substr(data,1,4)

然后将上表与原表连接,连接条件是年份与气温符合的,然后再找出那天是哪一天

select
a.year year,a.max_temp max_temp,substr(b.data,1,8) day
from
(select
substr(data,1,4) year,max(cast(substr(data,-2,2) as int))
max_temp
from interview03
group by substr(data,1,4)
)a join
interview03 b on
a.year=substr(b.data,1,4) and a.max_temp=cast(substr(b.data,-2,2) as int);

结果

year    max_temp        day
2001    29      20010105
2007    99      20070109
2008    37      20080103
2010    17      20100103
2012    32      20120107
2013    29      20130109
2014    17      20140103
2015    99      20150109

4.现有一份以下格式的数据:表示有id为1,2,3的学生选修了课程a,b,c,d,e,f中其中几门

id course
1,a
1,b
1,c
1,e
2,a
2,c
2,d
2,f
3,a
3,b
3,c
3,e

编写Hive的HQL语句来实现以下结果:
表中的1表示选修,表中的0表示未选修

id   a   b   c   d   e   f
1   1   1   1   0   1   0
2   1   0   1   1   0   1
3   1   1   1   0   1   0

建表与导入数据

create table if not exists interview04(id int,course string) row format delimited fields terminated by ",";load data local inpath "/home/hadoop/hive_data/interview04" into table interview04;

首先得到所有备选课程

select collect_set(trim(course))courses from interview04;

然后求每一个学员选修的课程

select
id,collect_set(trim(course)) id_course
from interview04
group by id;

这里要使用笛卡尔积关联(a表中的每一天数据关联b表所有数据),从原表中查询course字段放入set集合中,然后与上表关联,得到已选课程与备选课程

首先修改笛卡尔积参数

set hive.strict.checks.cartesian.product=false;
set hive.mapred.mode=nonstrict;

辅助SQL:

select
b.id id,b.id_course id_course,a.courses courses
from
(select collect_set(trim(course))courses from interview04
) a join
(select
id,collect_set(trim(course)) id_course
from interview04
group by id
) b;
id      id_course       courses
1       ["a","b","c","e"]       ["a","b","c","e","d","f"]
2       ["a","c","d","f"]       ["a","b","c","e","d","f"]
3       ["a","b","c","e"]       ["a","b","c","e","d","f"]

最终SQL:

判断a表与b表中元素的包含关系即可

select
id,
if(array_contains(id_course,courses[0]),1,0) a,
if(array_contains(id_course,courses[1]),1,0) b,
if(array_contains(id_course,courses[2]),1,0) c,
if(array_contains(id_course,courses[3]),1,0) e,
if(array_contains(id_course,courses[4]),1,0) d,
if(array_contains(id_course,courses[5]),1,0) f
from
(select
b.id id,b.id_course id_course,a.courses courses
from
(select collect_set(trim(course))courses from interview04
) a join
(select
id,collect_set(trim(course)) id_course
from interview04
group by id
) b
) c;

最终结果

id      a       b       c       e       d       f
1       1       1       1       1       0       0
2       1       0       1       0       1       1
3       1       1       1       1       0       0

5.现有如下格式的一份数据,需求:编写Hive的HQL语句求出每个店铺的当月销售额和累计到当月的总销售额

uid month sale

a,01,150
a,01,200
b,01,1000
b,01,800
c,01,250
c,01,220
b,01,6000
a,02,2000
a,02,3000
b,02,1000
b,02,1500
c,02,350
c,02,280
a,03,350
a,03,250

建表与导入数据

create table if not exists interview05(uid string,month string,sale int) row format delimited fields terminated by ",";
load data local inpath "/home/hadoop/hive_data/interview05" into table interview05;

最终SQL:

与第一题类似,先求总销售额,再进行开窗算出累计到当月的总销售额

select uid,month,
sum(sales) over(distribute by uid sort by month)sumsales,sales
from
(select uid,month,sum(sale)sales
from interview05
group by uid,month)tmp;

结果:

uid     month   sumsales        sales
a       01      350     350
a       02      5350    5000
a       03      5950    600
b       01      7800    7800
b       02      10300   2500
c       01      470     470
c       02      1100    630

精选——Hive十道面试题(上)相关推荐

  1. 精选——Hive十道面试题(下)

    1.求出要求格式的数据 数据: 字段含义: 日期,MAC,颜色,销量 day,mac,color,num 20171011 1292 金色 1 20171011 1292 金色 14 20171011 ...

  2. 二十道面试题成都至少16k

    面试题: HashMap底层实现原理,红黑树,B+树,B树的结构原理,volatile关键字,CAS(比较与交换)实现原理 Spring的AOP和IOC是什么?使用场景有哪些?Spring事务,事务的 ...

  3. 探讨Java中最常见的十道面试题(超经典)

    第一,谈谈final, finally, finalize的区别.  final?修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承.因此一个类不能既被声明 ...

  4. 产品经理会被问到的十道面试题

    首先,我们来看看一般哪些小伙伴会投产品岗: 那么,正在看这篇文章的你,属于上面哪一种呢? (`・ω・´) 不管属于哪一种,是技术大神也好,领域小白也好,对于刚入产品岗门的你们来说,这篇文章就是必备品! ...

  5. 动画解决TCP 三次握手与四次挥手(附十道面试题)

    装载!!!!!!!至CSDN博主 小书go的<两张动图-彻底明白TCP的三次握手与四次挥手>,网址:https://blog.csdn.net/qzcsu/article/details/ ...

  6. 每日十道面试题(五)

    1. Servlet的基本架构 Servlet是Server与Applet的缩写,是服务端小程序的意思.是SUN公司提供的一门用于开发动态Web资源的技术. Servlet本质上也是Java类,但要遵 ...

  7. http相关十道面试题(含答案)

    目录 1,http协议 2.HTTP 和 HTTPS 的区别? 3,get和post的区别主要有以下几方面: 1.url可见性: 2.数据传输上: 3.缓存性: 4.后退页面的反应 5.传输数据的大小 ...

  8. 每天十道面试题(六)

    1.浏览器页面有哪三层构成,分别是什么,作用是什么? 参考答案: 构成:结构层.表达层.行为层 分别是:HTML.CSS.JavaScript 作用:HTML实现页面结构,CSS完成页面的表现与风格, ...

  9. 海量数据处理:十道面试题与十个海…

    http://blog.csdn.net/rockeylu/article/details/7476291

最新文章

  1. Python命令行补全设置
  2. 学习 TList 类的实现[5]
  3. 基于vue-cli配置手淘的lib-flexible + rem,实现移动端自适应
  4. 在线聊天javascript代码
  5. HTML中直接写js 函数
  6. 6-6-阶段案例:传智书城JSP页面
  7. extract-text-webpack-plugin用法
  8. 用C#实现图片数据库存储与显示
  9. linux防火墙常用相关操作
  10. 重新审视SqlDataReader的使用
  11. 流行的php面试题及答案
  12. Perl语言程序设计_简介
  13. 信用报告OCR服务 助力授信审核快人一步
  14. keil的终极配色方案(提供配置文件)
  15. [c#]使用Fleck实现简单的WebSocket含兼容低版本IE
  16. 我的移动智能2-corner detection
  17. 社交瓶颈下,为何巨头都选择用“眼镜”做平台?
  18. android 感应器
  19. Linux-Ubuntu 和 安装 genymotion 的一些问题和一些命令
  20. App中 微信分享 代付功能 业务设计 与 代码实现

热门文章

  1. 将栅格影像转换为CAD/GIS矢量的3种方法
  2. Python3.7中,Django配置MySql数据库
  3. MICCAI 2019 Proceeding 论文集part1-6
  4. win7 怎么修改记事本的默认编码(测试有效果)
  5. 黑盒测试之导入CVS文件之什么是CVS文件
  6. 苏嵌//毛丽媛//2018.7.11
  7. matlab .m 返回值,MATLAB一个M文件的function返回值怎么在另一个M文件中的函数调用这个返回值?...
  8. Vue 适配iOS、Android顶部状态栏(沉浸式,混合APP开发)
  9. 关于合格设计师的30条冷知识
  10. 微信支付time_expire时间过短,刷卡至少1分钟,其他5分钟