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

168大数据

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[Hive] hive的典型应用场景

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

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

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

x
本帖最后由 168主编 于 2019-6-24 19:26 编辑

案例一:
需求:现有这么一批数据,现要求出:每个用户截止到每月为止的最大单月访问次数和累计到该月的总访问次数。
数据
[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,11

最终结果
[AppleScript] 纯文本查看 复制代码
用户  月份      最大访问次数  总访问次数       当月访问次数
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

解决
[AppleScript] 纯文本查看 复制代码
#step01 统计每个用户每月的总访问次数
create view view_step01 as select name,month,sum(visitCount) total from t_user  group by name,month;
#step02 (自连接,连接条件为name)
create view view_step02 as
    select t1.name aname,t1.month amonth,t1.total atotal,t2.name bname,t2.month bmonth,t2.total btotal
    from view_step01 t1 join view_step01  t2 on t1.name =t2.name 
#step03 去除无用数据,每组找到小于等于自己月份的数据
select bname,bmonth,max(btotal),sum(btotal),btotal
from view_step02
where unix_timestamp(amonth,'yyyy-MM')>=unix_timestamp(bmoth,'yyyy-MM')
group by aname,amonth,atotal;

案例二:
[AppleScript] 纯文本查看 复制代码
CREATE TABLE `course` ([/align]  `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;
#插入数据
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);

需求:所有数学课程成绩 大于 语文课程成绩的学生的学号
解决:(行列转换)
[AppleScript] 纯文本查看 复制代码
SELECT
    t1.sid 
FROM
    (
SELECT
    sid,
    max( CASE `course` WHEN "yuwen" THEN score ELSE 0 END ) AS "yuwen",
    max( CASE `course` WHEN "shuxue" THEN score ELSE 0 END ) AS "shuxue" 
FROM
    `course` 
GROUP BY
    sid 
    ) t1 
WHERE
    t1.yuwen < t1.shuxue;


案例三:
需求:比如:2010012325表示在2010年01月23日的气温为25度。现在要求使用hive,计算每一年出现过的最大气温的日期+温度。
数据
[AppleScript] 纯文本查看 复制代码
年 温度
20140101 14
20140102 16
20140103 17
20140104 10
20140105 06
20120106 09
20120107 32
20120108 12
20120109 19
20120110 23
20010101 16
20010102 12
20010103 10
20010104 11
20010105 29
20130106 19
20130107 22
20130108 12
20130109 29
20130110 23
20080101 05
现在需要根据年月进行group by 但是最终的结果需要是20080101 05,也就是说,分组字段和最后保留的字段不相同,这时怎么办?
解决
[AppleScript] 纯文本查看 复制代码
#Step1:
CREATE VIEW view_step1 AS SELECT
substr( tmp, 1, 4 ) AS YEAR,
max( substr( tmp, 9, 2 ) ) AS tmp 
FROM
    tmp 
GROUP BY
    substr( tmp, 1, 4 );

#Step2:
SELECT
    b.tmp,
    a.tmp 
FROM
    view_step1 a
    JOIN tmp b ON a.YEAR = substr( b.tmp, 1, 4 ) 
    AND a.tmp = substr( b.tmp, 9, 2 );

案例四:
数据
[AppleScript] 纯文本查看 复制代码
#表示有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表示未选修。

解决(方案1):
[AppleScript] 纯文本查看 复制代码
#行列转换
select id 
max(case when course='a' then 1 else 0 and ) as a ,
max(case when course='b' then 1 else 0 and ) as b ,
max(case when course='c' then 1 else 0 and ) as c ,
max(case when course='d' then 1 else 0 and ) as d ,
max(case when course='e' then 1 else 0 and ) as e ,
max(case when course='f' then 1 else 0 and ) as f
from course  group by id;

解决(方案2):
[AppleScript] 纯文本查看 复制代码
#collect_set函数
#step01
create view id_courses as 
select a.course acourse,b.course bcourse,b.id id
(select collect_set(course) as course from course) a 
    join 
(selecet id ,colect_set(course) as course from course group by id) b

#step02
select id,
case when array_contains(bcourse,acourse[0]) then 1 else 0 end as a ,
case when array_contains(bcourse,acourse[1]) then 1 else 0 end as b ,
case when array_contains(bcourse,acourse[2]) then 1 else 0 end as c ,
case when array_contains(bcourse,acourse[3]) then 1 else 0 end as d ,
case when array_contains(bcourse,acourse[4]) then 1 else 0 end as e ,
case when array_contains(bcourse,acourse[5]) then 1 else 0 end as f
from id_courses;
作者:原生zzy来源:https://blog.51cto.com/14048416/2342604
楼主热帖
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享 分享淘帖 赞 踩

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

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

本版积分规则

关闭

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

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

GMT+8, 2024-4-26 22:08

Powered by BI168大数据社区

© 2012-2014 168大数据

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