• 面试题1(京东)之HiveSql --- 难度:入门初级


    第1题

    有如下的用户访问数据

    userIdvisitDatevisitCount
    u012017/1/215
    u022017/1/236
    u032017/1/228
    u042017/1/203
    u012017/1/236
    u012017/2/218
    u022017/1/236
    u012017/2/224

    要求使用SQL统计出每个用户的累积访问次数,如下表所示:

    用户id月份小计累积
    u012017-011111
    u012017-021223
    u022017-011212
    u032017-0188
    u042017-0133

    数据:

    u01 2017/1/21 5

    u02 2017/1/23 6

    u03 2017/1/22 8

    u04 2017/1/20 3

    u01 2017/1/23 6

    u01 2017/2/21 8

    u02 2017/1/23 6

    u01 2017/2/22 4

    *参考答案:*

    img

    create table jd(
        id string,
        data string,
        count  int
    )row format delimited fields terminated by ' ';
    load data local inpath '/opt/hive_data/jd' into table jd;
    
    
    -- over后写字段名  子查询不用表名.字段名。  单表自连接才必须用表名.字段名
    select  id `用户id`,vDate `月份` ,`小计`,sum(`小计`)
    over(partition by id order by vDate rows between unbounded  preceding and current row )  `累积`
    from
    (select id,vDate,sum(count) `小计` from
    (select id ,date_format(regexp_replace(data,'/','-'),'yyyy-MM') as vDate ,count from jd) t1
    group by id,vDate) t2
    
    
    --date是string类型,若用此函数,必须满足date的标准格式.
    select year(date) from jd;
    -- 执行成功
    select date_format('2023-1-9','yyyy-MM')  datee;
    -- 第一个参数必须满足hive的时间格式,第二个自定义
    select date_format('2023-01-01 12:30:5','yyyy/MM/dd - HH/mm/ss')  datee;
    -- 这里执行失败。 '2023-1' 并不是可以识别的日期格式
    select date_format('2023-1','yyyy-MM')  datee;
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    第2题

    有50W个京东店铺,每个顾客访客访问任何一个店铺的任何一个商品时都会产生一条访问日志,访问日志存储的表名为Visit,访客的用户id为user_id,被访问的店铺名称为shop,请统计:

    1)每个店铺的UV(访客数)

    Select shop, count(user_id) from visit group by shop;

    2)每个店铺访问次数top3的访客信息。输出店铺名称、访客id、访问次数

    数据:

    u1 a

    u2 b

    u1 b

    u1 a

    u3 c

    u4 b

    u1 a

    u2 c

    u5 b

    u4 b

    u6 c

    u2 c

    u1 b

    u2 a

    u2 a

    u3 a

    u5 a

    u5 a

    u5 a

    *参考答案*

    create table jd2(
        username string,
        shopname string
    )row format delimited fields terminated by ' ';
    load data local inpath '/opt/hive_data/jd2' into table jd2;
    
    select * from jd2 tablesample ( 3 rows )
    
    
    
    -- 第一步:统计每一个店铺每一位顾客的访问次数
    
    select shop, userid, count(*) as visit_count from visit group by shop, userid;
    
     
    
    -- 第二步:对统计出来的访问次数排序(每一个店铺中分别排序)并给定编号
    
    select *,
    
    ​    rank() over(partition by shop order by visit_count desc) as n
    
    from (
    
      select shop, userid, count(*) as visit_count from visit group by shop, userid
    
    )t1;
    
     
    
    -- 第三步:筛选编号<=3的用户信息
    
    select *
    
    from (
    
      select *,
    
    ​      rank() over(partition by shop order by visit_count desc) as n
    
      from (select shop, userid, count(*) as visit_count from visit group by shop, userid
    
      )t1
        -- 这里的 where 字段是窗口函数的字段。只能在窗口函数的外部中去where
    
    ) t2 where n <= 3;
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 相关阅读:
      Apache Dubbo 首个 Node.js 3.0-alpha 版本正式发布
      【机器学习】聚类【Ⅰ】基础知识与距离度量
      158页完整版(5万字)数字化智慧停车场管理解决方案
      [Python] Basic Functions
      01UEc++【打飞艇】
      【暑期每日一题】洛谷 P2026 求一次函数解析式
      【scikit-learn基础】--『监督学习』之 岭回归
      基于JavaSwing开发3D立体字制作程序 课程设计 大作业
      Linux——进程控制
      高等教育学:师生关系
    • 原文地址:https://blog.csdn.net/m0_73450879/article/details/137175780