最具影响力的数字化技术在线社区

168大数据

 找回密码
 立即注册

QQ登录

只需一步,快速开始

1 2 3 4 5
打印 上一主题 下一主题
开启左侧

[Hive] Hive的5个面试题

[复制链接]
跳转到指定楼层
楼主
发表于 2019-3-30 14:23:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多数据大咖,获取更多知识干货,轻松玩转大数据

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 168主编 于 2019-3-30 14:35 编辑

目录
  • 一、求单月访问次数和总访问次数

    • 1、数据说明
    • 2、数据准备
    • 3、结果需求
    • 4、需求分析

  • 二、学生课程成绩

    • 1、说明
    • 2、需求

  • 三、求每一年最大气温的那一天  + 温度

    • 1、说明
    • 2、 需求
    • 3、解析

  • 四、求学生选课情况
  • 1、数据说明
  • 2、数据准备
  • 3、需求
  • 4、解析
  • 五、求月销售额和总销售额

    • 1、数据说明
    • 2、数据准备
    • 3、需求
    • 4、解析



正文
回到顶部

一、求单月访问次数和总访问次数1、数据说明数据字段说明用户名,月份,访问次数
数据格式
[AppleScript] 纯文本查看 复制代码
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,1

2、数据准备
(1)创建表
[AppleScript] 纯文本查看 复制代码
use myhive;
create external table if not exists t_access(
uname string comment '用户名',
umonth string comment '月份',
ucount int comment '访问次数'
) comment '用户访问表' 
row format delimited fields terminated by "," 
location "/hive/t_access";

(2)导入数据
load data local inpath "/home/hadoop/access.txt" into table t_access;
(3)验证数据
select * from t_access;
3、结果需求
现要求出:
每个用户截止到每月为止的最大单月访问次数和累计到该月的总访问次数,结果数据格式如下
4、需求分析
此结果需要根据用户+月份进行分组
(1)先求出当月访问次数
[AppleScript] 纯文本查看 复制代码
--求当月访问次数
create table tmp_access(
name string,
mon string,
num int
); 

insert into table tmp_access 
select uname,umonth,sum(ucount)
 from t_access t group by t.uname,t.umonth;

select * from tmp_access;


(2)tmp_access进行自连接视图
[AppleScript] 纯文本查看 复制代码
create view tmp_view as 
select a.name anme,a.mon amon,a.num anum,b.name bname,b.mon bmon,b.num bnum from tmp_access a join tmp_access b 
on a.name=b.name;

select * from tmp_view;

(3)进行比较统计
[AppleScript] 纯文本查看 复制代码
select anme,amon,anum,max(bnum) as max_access,sum(bnum) as sum_access 
from tmp_view 
where amon>=bmon 
group by anme,amon,anum;
二、学生课程成绩

1、说明

[AppleScript] 纯文本查看 复制代码
use myhive;
CREATE TABLE `course` (
  `id` int,
  `sid` int ,
  `course` string,
  `score` int 
) ;

[AppleScript] 纯文本查看 复制代码
// 插入数据
// 字段解释: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);


2、需求
求:所有数学课程成绩 大于 语文课程成绩的学生的学号
1、使用case...when...将不同的课程名称转换成不同的列
[AppleScript] 纯文本查看 复制代码
create view tmp_course_view as
select sid, case course when "shuxue" then score else 0 end  as shuxue,  
case course when "yuwen" then score else 0 end  as yuwen from course;  

select * from tmp_course_view;

2、以sid分组合并取各成绩最大值
[AppleScript] 纯文本查看 复制代码
create view tmp_course_view1 as
select aa.sid, max(aa.shuxue) as shuxue, max(aa.yuwen) as yuwen from tmp_course_view aa group by sid;  

select * from tmp_course_view1;
3、比较结果
select * from tmp_course_view1 where shuxue > yuwen;


三、求每一年最大气温的那一天  + 温度 1、说明
数据格式
2010012325
具体数据
[AppleScript] 纯文本查看 复制代码
2014010216
2014010410
2012010609
2012010812
2012011023
2001010212
2001010411
2013010619
2013010812
2013011023
2008010216
2008010414
2007010619
2007010812
2007011023
2010010216
2010010410
2015010649
2015010812
2015011023

数据解释
2010012325表示在2010年01月23日的气温为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,将数据切分
[AppleScript] 纯文本查看 复制代码
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;
(2)创建一个临时表tmp_year_weather
[AppleScript] 纯文本查看 复制代码
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;

(3)将2个临时表进行连接查询
[AppleScript] 纯文本查看 复制代码
select * from tmp_year_weather a join tmp_weather b on a.years=b.years and a.max_temp=b.temp;

四、求学生选课情况

1、数据说明
(1)数据格式
[AppleScript] 纯文本查看 复制代码
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

(2)字段含义
表示有id为1,2,3的学生选修了课程a,b,c,d,e,f中其中几门。
回到顶部

2、数据准备(1)建表t_course
[AppleScript] 纯文本查看 复制代码
create table t_course(id int,course string)
row format delimited fields terminated by ",";

(2)导入数据
load data local inpath "/home/hadoop/course/course.txt" into table t_course;
回到顶部

3、需求
编写Hive的HQL语句来实现以下结果:表中的1表示选修,表中的0表示未选修
[AppleScript] 纯文本查看 复制代码
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

4、解析
第一步:
select collect_set(course) as courses from id_course;
第二步:
[AppleScript] 纯文本查看 复制代码
set hive.strict.checks.cartesian.product=false;

create table id_courses as select t1.id as id,t1.course as id_courses,t2.course courses 
from 
( select id as id,collect_set(course) as course from id_course group by id ) t1 
join 
(select collect_set(course) as course from id_course) t2;

启用严格模式:hive.mapred.mode = strict // Deprecated
hive.strict.checks.large.query = true
该设置会禁用:1. 不指定分页的orderby
         2. 对分区表不指定分区进行查询
         3. 和数据量无关,只是一个查询模式
hive.strict.checks.type.safety = true
严格类型安全,该属性不允许以下操作:1. bigint和string之间的比较
                  2. bigint和double之间的比较
hive.strict.checks.cartesian.product = true
该属性不允许笛卡尔积操作

第三步:得出最终结果:
思路:
拿出course字段中的每一个元素在id_courses中进行判断,看是否存在。
[AppleScript] 纯文本查看 复制代码
select id,
case when array_contains(id_courses, courses[0]) then 1 else 0 end as a,
case when array_contains(id_courses, courses[1]) then 1 else 0 end as b,
case when array_contains(id_courses, courses[2]) then 1 else 0 end as c,
case when array_contains(id_courses, courses[3]) then 1 else 0 end as d,
case when array_contains(id_courses, courses[4]) then 1 else 0 end as e,
case when array_contains(id_courses, courses[5]) then 1 else 0 end as f 
from id_courses;

五、求月销售额和总销售额1、数据说明(1)数据格式
[AppleScript] 纯文本查看 复制代码
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

(2)字段含义
店铺,月份,金额
2、数据准备(1)创建数据库表t_store
[AppleScript] 纯文本查看 复制代码
use class;
create table t_store(
name string,
months int,
money int
) 
row format delimited fields terminated by ",";

(2)导入数据
[AppleScript] 纯文本查看 复制代码
load data local inpath "/home/hadoop/store.txt" into table t_store;

3、需求
编写Hive的HQL语句求出每个店铺的当月销售额和累计到当月的总销售额
4、解析
(1)按照商店名称和月份进行分组统计
[AppleScript] 纯文本查看 复制代码
create table tmp_store1 as 
select name,months,sum(money) as money from t_store group by name,months;

select * from tmp_store1;
(2)对tmp_store1 表里面的数据进行自连接
[AppleScript] 纯文本查看 复制代码
create table tmp_store2 as 
select a.name aname,a.months amonths,a.money amoney,b.name bname,b.months bmonths,b.money bmoney from tmp_store1 a 
join tmp_store1 b on a.name=b.name order by aname,amonths;

select * from tmp_store2;
(3)比较统计
[AppleScript] 纯文本查看 复制代码
select aname,amonths,amoney,sum(bmoney) as total from tmp_store2 where amonths >= bmonths group by aname,amonths,amoney;



楼主热帖
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享 分享淘帖 赞 踩

168大数据 - 论坛版权1.本主题所有言论和图片纯属网友个人见解,与本站立场无关
2.本站所有主题由网友自行投稿发布。若为首发或独家,该帖子作者与168大数据享有帖子相关版权。
3.其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和168大数据的同意,并添加本文出处。
4.本站所收集的部分公开资料来源于网络,转载目的在于传递价值及用于交流学习,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。
5.任何通过此网页连接而得到的资讯、产品及服务,本站概不负责,亦不负任何法律责任。
6.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源,若标注有误或遗漏而侵犯到任何版权问题,请尽快告知,本站将及时删除。
7.168大数据管理员和版主有权不事先通知发贴者而删除本文。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

关于我们|小黑屋|Archiver|168大数据 ( 京ICP备14035423号|申请友情链接

GMT+8, 2024-5-4 01:12

Powered by BI168大数据社区

© 2012-2014 168大数据

快速回复 返回顶部 返回列表