京东Hive SQL面试题:京东店铺访问统计的终极解法(附幽默彩蛋)

京东Hive SQL面试题:京东店铺访问统计的终极解法(附幽默彩蛋)

大家好,今天我们来破解一道京东跳动高频Hive SQL面试题——京东店铺访问统计。题目看似简单,但隐藏着窗口函数和分组聚合的巧妙配合。准备好你的咖啡,我们开始飙车!


题目描述

表结构:访问日志表Visit

  • user_id:访客ID(用户唯一标识)
  • shop:被访问的店铺名称

需求

  1. 统计每个店铺的UV(独立访客数)
  2. 输出每个店铺访问次数Top3的访客信息(店铺名、用户ID、访问次数)

解题思路

问题一:每个店铺的UV

UV即Unique Visitor,统计逻辑简单粗暴:按店铺分组,去重统计用户数
但要注意:50万店铺的数据量下,COUNT(DISTINCT)可能成为性能瓶颈。不过面试场景中,先保证逻辑正确,优化问题可后续讨论。

代码实现

SELECT 
    shop,
    COUNT(DISTINCT user_id) AS uv
FROM Visit
GROUP BY shop;

问题二:Top3访客信息

这里需要两步操作:

  1. 计算每个用户在各店铺的访问次数:按店铺和用户分组聚合
  2. 窗口函数排名:按访问次数降序排列,取前三名

代码实现

SELECT 
    shop,
    user_id,
    visit_count
FROM (
    SELECT 
        shop,
        user_id,
        visit_count,
        RANK() OVER (PARTITION BY shop ORDER BY visit_count DESC) AS rk
    FROM (
        SELECT 
            shop,
            user_id,
            COUNT(*) AS visit_count  -- 统计访问次数
        FROM Visit
        GROUP BY shop, user_id
    ) t1
) t2
WHERE rk <= 3;

技术细节剖析

  1. 为什么用RANK()而不用ROW_NUMBER()

    • RANK()允许并列排名(比如两个用户访问次数相同则共享名次),而ROW_NUMBER()强制顺序编号。
    • 但注意:如果出现并列第三名,RANK()可能导致结果超过3条。若题目要求严格3条,可改用ROW_NUMBER()
  2. 性能优化小贴士

    • 如果数据量极大,可先对shopuser_id建立联合索引。
    • 使用MAPJOIN对小表进行缓存优化(但本题中店铺数为50W,可能不适用)。

幽默彩蛋

面试官:如果某个店铺的Top3有10个用户并列怎么办?
你:那我建议京东给这10位“铁杆粉丝”颁发【最佳钉子户】奖杯,并附赠终身VIP——毕竟他们撑起了店铺的KPI!
(正经回答:需明确需求是否允许并列,或用DENSE_RANK()处理名次密度)


总结

  • UV统计:分组去重是核心
  • TopN问题:窗口函数+子查询的黄金组合
  • 面试加分点:讨论排名函数差异和性能优化策略

搞定这道题,你离字节的Offer又近了一步!🚀

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值