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、美团、字节、快手、京东等大厂的面经合集

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

相关推荐

大学四年还是干过不少兼职的。有的累,有的坑,有的又累又坑,总之干兼职都不咋轻松,可以来盘点一下红榜1.演员曾经给学校英语四六级宣传片当过演员,当时在学校机房待了一天还管顿饭,还翘掉了两节课,美滋滋,一天一百,就是有点晚。2.机构出题在上个暑假曾经给一些机构出过题用来招聘。待遇还是很不错的,就是当时跟课设撞一起了特别忙(没准你们做过我出的题,世界就是一个巨大的草台班子)3.家教现在没事正在干,对学生来讲,家教还是比较轻松的,只要不遇到难缠的家长,不学的学生。记住不要做廉价的那种。4.牛客对,就是牛客,在牛客发帖还是获得过不少东西的,有京东卡有纪念品,也是非常快乐的一段时光,还有牛客创作者激励。不过现在我已经沦为过气小卫了,压根没人看😭黑榜1.辅导站助教在寒假我姐辅导站帮忙,从此换上了小学生ptsd,nnd想象一下十几个三年级的小屁孩围着你转,这俩打架,这俩哭,这俩闹矛盾,就是没写作业的。身累心更累,绝对不推荐。2.发传单这事谁爱干谁干3.小红书擦边我写这纯粹是因为我没挣到这钱,😢为什么没人爱看丑人儿童身材擦边呢,我也不想努力了哥哥姐姐叔叔阿姨。4.校园大使干这个活有的辛苦,有的没那么辛苦。但是随机性太大,建议先问问干过的人。陕汽的校园大使,我跑前跑后干了好多天就给了二百,阿维塔的校园大使我当时干了还蛮轻松的,给了七八百也不少了。如果信息渠道少,还是不推荐。5.有待补充
除了主业以外,你还有哪些...
点赞 评论 收藏
分享
评论
3
2
分享

创作者周榜

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