当前位置:首页 >百科 >高频HIVE 我们整理归纳了一些问题出来

高频HIVE 我们整理归纳了一些问题出来

2024-06-29 05:49:23 [百科] 来源:避面尹邢网

高频HIVE-SQL笔试题详解(一)

作者: 数师兄 数据库 其他数据库 最近身边有不少小伙伴在考虑跳槽的高频事情,免不了的高频会遇到一些SQL的面试题,根据过往的经历和大伙儿的反馈,我们整理归纳了一些问题出来,高频以供大家参考。高频

[[394565]]

最近身边有不少小伙伴在考虑跳槽的高频事情,免不了的高频会遇到一些SQL的面试题。

高频HIVE 我们整理归纳了一些问题出来

根据过往的高频经历和大伙儿的反馈,我们整理归纳了一些问题出来,高频以供大家参考。高频

高频HIVE 我们整理归纳了一些问题出来

1.连续活跃问题

这个问题有两个变形:(1)某APP用户活跃记录表active,高频有uid(用户id)、高频dt(活跃日期)字段,高频求出连续出勤3天及以上的高频用户数 (2)某APP用户活跃记录表active,有uid(用户id)、高频dt(活跃日期)字段,高频求每个用户的最大连续活跃天数 以上两个问题要求输出的数据不同,但都是要考察对于窗口函数lead、lag的掌握能力。第二个是在第一个问题基础上的延伸,也可以作为此类问题的通解。我们按照顺序分别来进行解答。首先,我们构建一个表以供测试说明,形如下图:

高频HIVE 我们整理归纳了一些问题出来


考虑到权限问题,这里就不单独新建hive表了,直接在with子句中union出来一个临时表:

  1. WITH active AS 
  2.   (SELECT 100 UID, 
  3.               '2021-04-01'dt 
  4.    UNION ALL SELECT 101 UID, 
  5.                         '2021-04-01'dt 
  6.    UNION ALL SELECT 102 UID, 
  7.                         '2021-04-01'dt 
  8.    UNION ALL SELECT 103 UID, 
  9.                         '2021-04-01'dt 
  10.    UNION ALL SELECT 100 UID, 
  11.                         '2021-04-02'dt 
  12.    UNION ALL SELECT 101 UID, 
  13.                         '2021-04-02'dt 
  14.    UNION ALL SELECT 102 UID, 
  15.                         '2021-04-02'dt 
  16.    UNION ALL SELECT 103 UID, 
  17.                         '2021-04-02'dt 
  18.    UNION ALL SELECT 104 UID, 
  19.                         '2021-04-02'dt 
  20.    UNION ALL SELECT 100 UID, 
  21.                         '2021-04-03'dt 
  22.    UNION ALL SELECT 104 UID, 
  23.                         '2021-04-03'dt 
  24.    UNION ALL SELECT 101 UID, 
  25.                         '2021-04-04'dt 
  26.    UNION ALL SELECT 102 UID, 
  27.                         '2021-04-04'dt 
  28.    UNION ALL SELECT 103 UID, 
  29.                         '2021-04-04'dt 
  30.    UNION ALL SELECT 104 UID, 
  31.                         '2021-04-04'dt 
  32.    UNION ALL SELECT 105 UID, 
  33.                         '2021-04-04'dt 
  34.    UNION ALL SELECT 102 UID, 
  35.                         '2021-04-03'dt) 

(1)要知道一个用户连续活跃,那么肯定是要对他的所有活跃记录进行排序的。对于active这个表,每天每个活跃用户都会有一条记录,我们将每个用户的活跃记录按日期顺序排列,如果上一条记录的日期与本条记录的日期刚好相差1天,那么这两条记录就是连续的。反过来也就是说,连续出勤的记录之间,日期差值为1,推而广之,如果用户连续出勤了N天,那么这N条记录之中任意相邻的两条都是差1天,而这段记录开始的日期到结束的日期之间的差值则是N-1。如果某用户连续出勤了4天,那么从他第3天出勤的记录往前数第6条记录就刚好是他连续出勤的开始日期,所以,我们从每条记录往前数第6条的日期与本条记录的日期差值刚好是2天的话,就表示这期间没有间断。 我们利用lead获取每一条记录其往前第2条记录的日期,与本条记录日期求差值,如果这个差值等于2,就表明该用户连续出勤了3天及以上。具体计算sql如下所示,可以求得共有3个用户连续活跃了3天及以上。

  1. select 
  2. count(DISTINCT uid) 
  3. from( 
  4.         SELECT UID, 
  5.                dt, 
  6.                lag(dt,2)over(PARTITION BY UID ORDER BY dt)dt2 
  7.         FROM active 
  8.         )x 
  9. where datediff(dt,dt2)=2 

这是从后往前数,同样的利用lag函数可以获取每条记录往后数第2条记录的日期,如果有差值等于2的记录,那么也可以表明用户连续出勤了3天及以上。(2)有了第一个问题作为铺垫,再来看第二个问题,相信大家应该更容易有思路了。在这个问题下,没有明确给出要计算连续多少天活跃,而是要求每个用户的最大连续活跃天数。如此一来,我们就不能直接错位相减了,而是需要清晰地找到每一段连续活跃的起止时间点。所以我们首先要判断每条记录与其相邻的记录之间是否连续,如果不连续则说明这条记录是某一段连续活跃的起点或者终点。


给所有记录标记上是否是断点之后,我们就可以为每条记录去匹配距离他最近的一次起点:

根据上图的子查询,我们就能知道每条活跃记录是从哪天开始连续活跃的了,然后求每个用户UID下所有活跃记录中与其起始日期最大的差值即可:

  1. select 
  2. UID,max(datediff(dt,start_dt))days 
  3. from( 
  4.     select 
  5.     UID,dt,max(if(if_continue=0,dt,null))over(PARTITION BY UID ORDER BY dt)start_dt 
  6.     from( 
  7.         select 
  8.         UID,dt,dt2,if(datediff(dt,dt2)=1,1,0)if_continue 
  9.         from( 
  10.                 SELECT UID, 
  11.                        dt, 
  12.                        lag(dt,1)over(PARTITION BY UID ORDER BY dt)dt2 
  13.                 FROM active 
  14.                 )x 
  15.     )y 
  16. )z 
  17. group by UID 

如此,就求得了所有用户的最大连续活跃天数了:

无论是第一种还是第二种,主要都是考察窗口函数的应用。熟练掌握窗口函数,并灵活运用,此类问题就不在话下了。

 

责任编辑:姜华 来源: 数师兄 HIVE-SQLSQL数据库

(责任编辑:焦点)

    推荐文章
    • 北交所11月13日开市通关测试 上市公司将达81家

      北交所11月13日开市通关测试 上市公司将达81家自官宣设立北京证券交易所(以下简称“北交所”)后,各项筹备工作紧锣密鼓,相关工作亦衔枚疾进。11月11日,北交所在官网发布通知表示,将于11月13日开展开市通关测试。伴随北交所 ...[详细]
    • 默默付出 做好东西部协作各项工作服务

      默默付出 做好东西部协作各项工作服务广东省中山市派驻贵州省六盘水市工作组组员范超:不同于在前方亲身参与推动各项工作具体落实的“扶友”,虽同处东西部协作“一线”,广东省中山市派驻贵州省六盘水市工作组组员范超更多时候是在幕后发挥参谋助手、桥 ...[详细]
    • 世界数字教育联盟在上海正式宣布成立

      世界数字教育联盟在上海正式宣布成立转自:红星新闻1月30日,以“数字教育:应用、共享、创新”为主题的2024世界数字教育大会在上海开幕。会议期间,世界数字教育联盟正式宣布成立。联盟发起方代表,中国教育国际交流协会会长刘利民向与会嘉宾介 ...[详细]
    • vivo总裁沈炜新年致辞:前行即答案

      vivo总裁沈炜新年致辞:前行即答案1月30日,vivo在广东东莞全球总部召开2023线上年会暨创新颁奖盛典。vivo创始人、总裁兼首席执行官沈炜在会上发表题为《前行即答案》的演讲,总结vivo近一年经营成果,诠释科技创新与经营管理理念 ...[详细]
    • 花呗为什么提前还款是大忌 具体原因有哪些?

      花呗为什么提前还款是大忌 具体原因有哪些?很多人会使用花呗提前消费,无法一次性还款就会办理花呗分期,等手里头有钱了就打算提前还款。虽说花呗分期是支持提前还款,可有不少人认为花呗提前还款是大忌。那么,花呗为什么提前还款是大忌?这里就来给大家分析 ...[详细]
    • Soul:以数字化创新,打造绿色清朗温暖的社交空间

      Soul:以数字化创新,打造绿色清朗温暖的社交空间2024年,中国经济站在了“稳中求进、以进促稳”的新的历史起点。专家认为,中国经济目前总体上正处于新动能逐渐崛起的阶段。而随着人们对生活方式的追求发生变化,新经济企业迎来了新的机遇。为此,红星新闻特推 ...[详细]
    • “小柯”秀

      “小柯”秀《自然-物理学》科学家揭示材料老化过程中的时间可逆性德国达姆施塔特工业大学Thomas Blochowicz等人揭示了材料老化过程中的时间可逆性。相关研究1月26日发表于《自然-物理学》。研究人员利用 ...[详细]
    • 受贿4087万,套取公款783万!南航深圳分公司原总经理刘国军一审获刑14年

      受贿4087万,套取公款783万!南航深圳分公司原总经理刘国军一审获刑14年1月30日,贵州黔东南州中级人民法院一审公开宣判中国南方航空股份有限公司深圳分公司原党委副书记、总经理刘国军受贿、贪污一案,对刘国军以受贿罪判处有期徒刑12年,并处罚金100万元,以贪污罪判处有期徒刑 ...[详细]
    • 四川巴中恩阳机场新增航线直通18个城市 去年旅客吞吐量38.2万人次

      四川巴中恩阳机场新增航线直通18个城市 去年旅客吞吐量38.2万人次2021年,恩阳机场旅客吞吐量38.2万人次。今年夏秋航季,巴中恩阳机场对航线进行优化,新增新航线。巴中恩阳机场2022年夏秋航季,西安——巴中——海口 ...[详细]
    • 山西晋中实施民办学校积分管理

      山西晋中实施民办学校积分管理    科技日报讯 记者韩荣)每发现有一项“一般负面清单”,扣2分;每发现有一项“重点负面清单”,扣4分……1月27日,记者从山西省晋中市教育部门获悉,该市对民办学校开展积分管理考核,以学年度为区间, ...[详细]
    热点阅读