row_number数据倾斜的最佳解决方案

需求背景

来自京东外卖-数据研发二面

已知一张京东外卖骑手收入表 dws_jd_emp_salary_1d,存放各地区各骑手当日的外卖收入情况,计算各地区骑手当日收入前三的名单

BJ

001

300

BJ

002

100

BJ

003

200

BJ

004

150

BJ

005

120

BJ

006

500

BJ

007

380

BJ

008

300

SH

009

600

SH

010

360

SQL代码如下:

select 
  area_id,
  emp_id,
  salary
from 
(  
  select 
    area_id,
    emp_id,
    salary,
    row_number() over(partition by area_id order by salary desc) rk
  from dws_jd_emp_salary_1d
  where dt = '20250523'
) t
where rk <= 3


面试官继续问:真实场景中,这个代码运行的非常慢,如何优化?

问题分析

回答:如果真实场景运行的非常慢,那么我认为可能是由两种原因导致的

  • 第一、员工收入表数据量非常大
  • 第二、ROW_NUMBER按照area_id分组时发生了数据倾斜

综合来看,第一种原因的可能性并不是很大,外卖业务是一个新业务,同时数据源是一张天级别汇总表,数据量不会太大,那么我接下来主要说一下第二种情况如何解决

解决方案

-- 1、将同一个区域的员工分散到10个桶中分别进行排序,并且获取对应的前三名
with t1 as (
  select 
    area_id,
    emp_id,
    salary
  from 
  (  
    select 
      area_id,
      emp_id,
      salary,
      row_number() over(partition by area_id, round(rand()*10)order by salary desc) rk
    from dws_jd_emp_salary_1d
    where dt = '20250523'
  ) t
  where rk <= 3
)
-- 2、对同一个区域的员工再次进行排序,然后获取前三名即为所求
select 
  area_id,
  emp_id,
  salary
from 
(  
  select 
    area_id,
    emp_id,
    salary,
    row_number() over(partition by area_id order by salary desc) rk
  from t1
) t
where rk <= 3

思考:为什么这样就可以提升代码运行效率?

#数据人的面试交流地##京东美团大战,你怎么看?#
大数据开发面试笔记 文章被收录于专栏

包括大数据篇、计算机语言篇、计算机基础篇、算法刷题篇、面试经验篇等五大篇章: 大数据篇包括框架原理、源码解析、调优技巧、大数据场景题、项目实战、数仓理论等模块;计算机语言篇包括Java、Linux、大厂常考SQL面试题等模块;计算机基础篇包括计算机网络、操作系统、数据库、数据结构等模块;算法刷题篇包括大厂高频算法题、刷题速成计划等模块 面试经验篇包括BAT、美团、字节、快手、京东等大厂的面经合集

全部评论
点赞 回复 分享
发布于 2025-06-02 00:51 广东

相关推荐

2025-12-28 20:47
已编辑
北京工商大学 Java
程序员牛肉:我靠你这个实习经历其实最需要担心的点是你做的太多了,可能会被面试官怀疑是你伪造的。 交易状态机是你做的,支付多渠道是你做的,对账是你做的,结算还是你做的,重复支付也是你做的,整个服务的异常处理也是你做的。 其实你这个反而问题很大的,你想想站在面试官的角度,他是真的会相信你的能力很强,还是相信这份实习你伪造了大部分?我相信你真的做了这么多,但是删一些,废话删一删。你这个做的太多了反而真实性不可信。 后面再补一个项目,在github上找一个高star的项目学一学然后写到自己简历上。我觉得你能力肯定没问题。28届能做到这个份上很厉害,但是在求职市场中,你不是在跟28届的同学比,把你这个简历放到27届其实也就一般水平。 所以后续要想一想看看能不能给自己简历上搞点亮点,比如开源贡献呢?比如博客呢?
实习要如何选择和准备?
点赞 评论 收藏
分享
评论
3
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务