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 广东

相关推荐

在北京上海这种地方租房,一般要付一个月房租、押一个月房租,俗称押一付n,建议准备5000以上。确认要在某地区租房后,最好提前找房,可以把自己的要求写个帖子发小红书,会有房东、中介、转租的人来评论区贡献房源。如果你钱少事多,大家也会在评论区diss你。租房千万不要心急,不要怕麻烦,多问几家,多看几个平台,比如小红书、闲鱼、自如都可以租房。不要害怕中介,有可能加了中介费价格也比较划算。但是如果有价格超低的好房,一定要把握住,因为犹豫,我错过了1750元一个月的房子。看到喜欢的房子不要轻易答应交定金或签约,多看几家,对房子的租金是否合适就心中有数,不然年轻人租房容易被坑,容易被甜言蜜语哄骗,容易不好意思拒绝。对方可能开高价一直没蹲到租客,你愿意做冤大头吗?出租者和租房者双向选择,不交订金,就有一方可能会毁约。当然交订金也有风险,一般租房交500块钱定金,金额没达到立案的标准。需要警惕发帖者的文字游戏。我在小红书上看到一个比较ok的房,转租的小姐姐在笔记中说2100一个月(包含物业费),确认要租了才发现是2297.7元一个月……一、看房看什么?1、房东是否是房东,如果是二房东,是否有信用背书,不放心可以让房东出示租房证明,签书面合同,开收款单。2、如果想骑共享单车上班,需要确认共享单车是否能停在楼下,还是只能停在小区外面,上下班的时候有没有共享单车骑。租现在住的房子的时候,我只考虑了距离,没考虑没车骑的情况,小区离地铁站超级远,没车骑坐公交要花蛮久的。3、是否有电梯,楼层情况,一楼潮湿蚊虫多,甚至可能还会有老鼠。顶楼夏天很热开空调费钱,老破小存在漏雨风险。4、如果有办公学习需求,需要看一下桌子的位置,如果位置不合适,是否能够摆放在其他采光更好的位置,比如如果桌子两角贴墙,再坐下就挡住光线了,必须开台灯,但是其余的地方是阳台,不能把桌子正对着阳台,夏天以及中午下午阳光会很刺眼。5、看附近是否有学校、菜市场、餐饮店,隔壁有学校白天会很吵,有餐饮店会有异味。6、房间隔音情况,室友是否吵闹。通过敲墙壁确认是否为隔断房。测隔音,可以把手机贴隔壁房间墙上,或者把手机在房间门口外放,关上门看看能听到多大声音。睡眠质量差的人一定要做!以及需要测玻璃窗的隔音情况,窗户关上后能否将外界噪音很好的分隔开。现在住的地方每天凌晨楼顶飞机轰轰的,睡眠质量较差的我,睡觉时戴降噪耳机才能睡着……7、床垫的质量。质量不太好的床垫,动一下里面的弹簧就会吱嘎作响,这个可能得你人到床上才能测出来。8、充电插孔是否都有电,厕所冲水是否能冲干净,淋浴器水压如何……8、喜欢做饭的可以看看有没有厨房,没有燃气做饭比较麻烦,电锅不如炒锅好刷。9、喜欢阳光的,看房屋朝向。可以来看两次房,白天看房间采光情况,晚上看房间灯光亮不亮。10、房间里有没有垃圾桶、拖把等卫生工具,如果有的话能否用现成的,没有的话可能需要自己买。11、合租需要看几个人共用厕所,室友的卫生情况,比如马桶是否有尿渍,厕所地上有没有头发,垃圾有没有堆门口。可以顺便问一下室友的性别,部分男性会很ex,比如:去年暑假隔壁男室友和我都是山东的,我们算老乡,一天晚上他说饿了,想问我要点吃的,我去送面包的时候,他关着灯,只穿着内裤坐在床上,当时吓着我了。二、租房前,一定要确认下面的问题1、是否提供免费wifi,或者如有室友自费wifi,使用时每月需要支付多少费用。2、水电燃是和合租室友均摊还是每个房间都有电表,只分摊水费和燃气费。如果电费按租户均摊,部分人可能会恶意一直开空调,拉高你交的电费。3、房租是否包含物业费。4、每月何时交租。5、最短能租多长时间。实习生一般实习2-3个月,需要寻找短租房,或者签长期合同再转租。6、违约如何处理。如果提前退租、房东提前收回房子,要怎样处理。房东退押金的条件,比如如果提前退租,如果能找到能够无缝衔接的下一任租客,可以退回一定比例的房租。7、看水电燃表,上一个租户搬走时是否结清全部欠费,不要不明不白地当了冤大头。8、是否能能换锁或修改密码,如果不能换锁的话,必须检验钥匙是否好用。房东可能把钥匙配了很多把,有的钥匙没配好,可能超级难用,不好开门。9、室友是否有抽烟饮酒的习惯,会不会频繁带朋友或异性回家,是否养宠物。三、转租要注意什么?1、需要确认转租是否需要扣押金或交转租费,谁来承担这笔费用,还是转租者与租房者协商承担这笔费用。2、问问房东房子没到期,如果找到下一个租客无缝衔接时,能否按照房租➗天数退租金。3、转租找到新的租房者后,一定和房东说好,不交钱不要给钥匙。人心叵测,防人之心不可无。人员过多时,容易出现信息无法第一时间互通的情况,最好三人拉群沟通。😸好的环境、较短的通勤时间会让自己心情愉悦,希望大家都能租到自己满意的房子~&nbsp;&nbsp;
牛客473059135号:在北京租房真的是什么雷都踩过了,但是北京这个城市就是这样,明明学校就在北京结果去公司通勤两小时真受不了不得不租房
点赞 评论 收藏
分享
评论
3
2
分享

创作者周榜

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