Hive五道经典面试题

摘要:
第4题打折日期交叉问题如下为平台商品促销数据:字段为品牌,打折开始日期,打折结束日期brandsttedtoppo2021-06-052021-06-09oppo2021-06-112021-06-21vivo2021-06-052021-06-15vivo2021-06-092021-06-21redmi2021-06-052021-06-21redmi2021-06-092021-06-15redmi2021-06-172021-06-26huawei2021-06-052021-06-26huawei2021-06-092021-06-15huawei2021-06-172021-06-21计算每个品牌总的打折销售天数,注意其中的交叉日期,比如vivo品牌,第一次活动时间为2021-06-05到2021-06-15,第二次活动时间为2021-06-09到2021-06-21其中9号到15号为重复天数,只统计一次,即vivo总打折天数为2021-06-05到2021-06-21共计17天。第5题同时在线问题如下为某直播平台主播开播及关播时间,根据该数据计算出平台最高峰同时在线的主播人数。
第 1 题 连续问题

如下数据为蚂蚁森林中用户领取的减少碳排放量

id dt lowcarbon
1001 2021-12-12 123
1002 2021-12-12 45
1001 2021-12-13 43
1001 2021-12-13 45
1001 2021-12-13 23
1002 2021-12-14 45
1001 2021-12-14 230
1002 2021-12-15 45
1001 2021-12-15 23… …

找出连续 3 天及以上减少碳排放量在 100 以上的用户

第 2 题 分组问题

如下为电商公司用户访问时间数据

id ts(秒)
1001 17523641234
1001 17523641256
1002 17523641278
1001 17523641334
1002 17523641434
1001 17523641534
1001 17523641544
1002 17523641634
1001 17523641638
1001 17523641654

某个用户连续的访问记录如果时间间隔小于 60 秒,则分为同一个组,结果为:

id ts(秒) group
1001 17523641234 1
1001 17523641256 1
1001 17523641334 2
1001 17523641534 3
1001 17523641544 3
1001 17523641638 4
1001 17523641654 4
1002 17523641278 1
1002 17523641434 2
1002 17523641634 3
第 3 题 间隔连续问题

某游戏公司记录的用户每日登录数据

id dt
1001 2021-12-12
1002 2021-12-12
1001 2021-12-13
1001 2021-12-14
1001 2021-12-16
1002 2021-12-16
1001 2021-12-19
1002 2021-12-17
1001 2021-12-20

计算每个用户最大的连续登录天数,可以间隔一天。解释:如果一个用户在 1,3,5,6 登录游戏,则视为连续 6 天登录。

第 4 题 打折日期交叉问题

如下为平台商品促销数据:字段为品牌,打折开始日期,打折结束日期

brand stt edt
oppo 2021-06-05 2021-06-09oppo 2021-06-11 2021-06-21vivo 2021-06-05 2021-06-15vivo 2021-06-09 2021-06-21redmi 2021-06-05 2021-06-21redmi 2021-06-09 2021-06-15redmi 2021-06-17 2021-06-26huawei 2021-06-05 2021-06-26huawei 2021-06-09 2021-06-15huawei 2021-06-17 2021-06-21

计算每个品牌总的打折销售天数,注意其中的交叉日期,比如 vivo 品牌,第一次活动时间为 2021-06-05 到 2021-06-15,第二次活动时间为 2021-06-09 到 2021-06-21 其中 9 号到 15号为重复天数,只统计一次,即 vivo 总打折天数为 2021-06-05 到 2021-06-21 共计 17 天。

第 5 题 同时在线问题

如下为某直播平台主播开播及关播时间,根据该数据计算出平台最高峰同时在线的主播人数。

id stt edt
1001 2021-06-14 12:12:12 2021-06-14 18:12:12
1003 2021-06-14 13:12:12 2021-06-14 16:12:12
1004 2021-06-14 13:15:12 2021-06-14 20:12:12
1002 2021-06-14 15:12:12 2021-06-14 16:12:12
1005 2021-06-14 15:18:12 2021-06-14 20:12:12
1001 2021-06-14 20:12:12 2021-06-14 23:12:12
1006 2021-06-14 21:12:12 2021-06-14 23:15:12
1007 2021-06-14 22:12:12 2021-06-14 23:10:12
答案:自己一定要先做,不要直接看答案!!!

第一题:

1)按照用户ID以时间字段分组,计算每个用户单日减少的碳排放量大于100的

selectid,
       dt,
       sum(lowcarbon) lowcarbon
fromtest1
group byid,dt
having lowcarbon > 100;t1

2)等差数列:两个等差数列若等差相同,则相同位置的数列相减得到的结果相同
按照用户分组,同时按照时间排序,计算每条数据的Rank值

selectid,
       dt,
       lowcarbon,
       rank() over(partition by id order bydt) rk
from t1;t2

3)将每行数据中的日期减去Rank值

selectid,
       dt,
       lowcarbon,
       date_sub(dt,rk) flag
from t2;t3

4)按照用户以及flag分组,找出记录大于等于3条的

selectid,
       flag,
       count(*) num
fromt3
group byid,flag
having num >= 3;

5)最终的HQL

selectid,
       flag,
       count(*) num
from(
    selectid,
           dt,
           lowcarbon,
           date_sub(dt,rk) flag
    from(
        selectid,
               dt,
               lowcarbon,
               rank() over(partition by id order bydt) rk
        from(
            selectid,
                   dt,
                   sum(lowcarbon) lowcarbon
            fromtest1
            group byid,dt
            having lowcarbon > 100) t1
    ) t2
) t3
group byid,flag
having num >= 3;

第二题:

1)将上一行时间数据下移

selectid,
       ts,
       lag(ts,1,0) over(partition by id order byts) lagts
from test2;t1

2)将当前行的时间减去上一行的时间

selectid,
       ts,
       ts-lagts diffts
from t1;t2

3)每个用户范围内从第一行到当前行,判断diffts是否大于等于60,若diffts>=60,则加1,否则不变

selectid,
       ts,
       sum(if(diffts>=60,1,0)) over(partition by id order byts) groupid
from t2;t3

4)最终的HQL

selectid,
       ts,
       sum(if(diffts>=60,1,0)) over(partition by id order byts) groupid
from(
    selectid,
           ts,
           ts-lagts diffts
    from(
        selectid,
               ts,
               lag(ts,1,0) over(partition by id order byts) lagts
        fromtest2
    ) t1
) t2

第三题:

1)将上一行时间下移

selectid,
       dt,
       lag(dt,1,'1970-01-01') lagdt
from test3;t1

2)将当前行时间减去上一行时间

selectid,
       dt,
       datediff(dt,lagdt) diffdt
from t1;t2

3)按照用户分组,并按时间排序,计算第一行到当前行大于2的数据总条数

selectid,
       dt,
       sum(if(diffdt>2,1,0)) groupid
from t2;t3

4)按照用户和groupid分组,求最大时间减去最小时间,然后加1

selectid,
       groupid,
       (max(dt)-min(dt)+1) maxday
from t3;t4

5)取连续登录天数的最大值

selectid,
       max(maxday) loginmax
fromt4
group by id

6)最终的HQL

selectid,
       max(maxday) loginmax
from(
    selectid,
           groupid,
           (max(dt)-min(dt)+1) maxday
    from(
        selectid,
               dt,
               sum(if(diffdt>2,1,0)) groupid
        from(
            selectid,
                   dt,
                   datediff(dt,lagdt) diffdt
            from(
                selectid,
                       dt,
                       lag(dt,1,'1970-01-01') lagdt
                fromtest3
            ) t1
        ) t2
    ) t3
) t4
group by id

第四题:

1)将当前行以前的数据中最大的edt放置当前行

selectid,
       stt,
       edt,
       max(edt) over(partition by id order by stt rows unbounded preceding and 1preceding) maxEdt
from test4;t1

2)比较开始时间与移动下来的时间,若开始时间大,则不需要操作,否则,需要将移动下来的时间加1替换当前行的开始时间,若第一行数据,maxEdt为null,不需要操作

selectid,
       if(maxEdt is null,stt,if(stt>maxEdt,stt,date_add(maxEdt,1))) stt,
       edt
from t1;t2

3)将每行数据中的结束日期减去开始日期

selectid,
       datediff(edt,stt) day
from t2;t3

4)按照品牌分组,计算每条数据加1的总和

selectid,
       sum(if(day>=0,day+1,0)) days
fromt3
group by id;

5)最终的HQL

selectid,
       sum(if(day>=0,day+1,0)) days
from(
    selectid,
           datediff(edt,stt) day
    from(
        selectid,
               if(maxEdt is null,stt,if(stt>maxEdt,stt,date_add(maxEdt,1))) stt,
               edt
        from(
            selectid,
                   stt,
                   edt,
                   max(edt) over(partition by id order by stt rows unbounded preceding and 1preceding) maxEdt
            fromtest4
        ) t1
    ) t2
) t3
group by id;

第五题:

1)对数据分类,在开始时间后添加1,表示有主播上线,同时在关闭时间后添加-1,表示有主播下线

selectid,
       stt dt,
       1p
fromtest5
union
selectid,
       edt dt,
       -1p
from test5;t1

2)按照时间排序,计算累加人数

selectid,
       dt,
       sum(p) over(order bydt) sum_p
from t1;t2

3)找出同时在线人数最大值

select max(sum_p)
from t2;

4)最终的HQL

select max(sum_p)
from(
    selectid,
           dt,
           sum(p) over(order bydt) sum_p
    from(
        selectid,
               stt dt,
               1p
        fromtest5
        union
        selectid,
               edt dt,
               -1p
        fromtest5
    ) t1
) t2;

免责声明:文章转载自《Hive五道经典面试题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Android _优雅实现元素间的分割线 (支持3.0以下)Jquery学习---Easy UI 框架下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

CDH| Cloudera Manager的安装

一.  cloudera manager的概念 简单来说,Cloudera Manager是一个拥有集群自动化安装、中心化管理、集群监控、报警功能的一个工具(软件),使得安装集群从几天的时间缩短在几个小时内,运维人员从数十人降低到几人以内,极大的提高集群管理的效率。 功能: 1)   管理:对集群进行管理,如添加、删除节点等操作。 2)   监控:监控集群...

hive 时间戳函数之unix_timestamp,from_unixtime

一. 日期>>>>时间戳1.unix_timestamp() 获取当前时间戳 例如:select unix_timestamp() --1565858389 2.unix_timestamp(string timestame) 输入的时间戳格式必须为'yyyy-MM-dd HH:mm:ss',如不符合则返回null 例如...

Hive面试题收集 ---阿善重要

Hive 原理 1.用户提交查询等任务给Driver。 2.编译器获得该用户的任务Plan。 3.编译器Compiler根据用户任务去MetaStore中获取需要的Hive的元数据信息。 4.编译器Compiler得到元数据信息,对任务进行编译,先将HiveQL转换为抽象语法树,然后将抽象语法树转换成查询块,将查询块转化为逻辑的查询计划,重写逻辑查询计划,...

sqoop 安装与使用

Sqoop(发音:skup)是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。 官网:http://sqoop.apache.org/ 由于官方不建议将sq...

beeline: 新版连接Hive server的工具

HiveServer2支持一个新的命令行Shell,称为Beeline,它是基于SQLLine CLI的JDBC客户端。它是从 Hive 0.11版本引入的,是Hive新的命令行客户端工具。Hive客户端工具后续将使用Beeline替代HiveCLI,并且后续版本也会废弃掉HiveCLI客户端工具。 Beeline支持嵌入模式(embedded mode)...

SparkSQL学习笔记

概述冠状病毒来临,宅在家中给国家做贡献之际,写一篇随笔记录SparkSQL的学习笔记,目的有二,一是记录整理之前的知识作为备忘录,二是分享技术,大家共同进步,有问题也希望大家不吝赐教。总体而言,大数据主要包含三种操作:长时间运行的批量数据处理;交互式运行的数据查询;实时数据流处理。sparkSQL特点:数据兼容,不仅兼容hive,还可以从rdd,parqu...