背景:公司使用presto查询数据,presto使用内存计算,为避免用户运行大sql,导致presto崩溃,数据平台RD设置了单个节点的最大内存限制,使用row_number()over()等窗口函数非常容易超过内存限制,无法运行sql。
解决:用python pandas的groupby和rank进行排序
代码:df.['rank'] = df.groupby(['分组列'])['排序列'].rank(ascending = True , method = 'first')
参数说明:
ascending :
True 升序
False 降序
method :
dense——值相同,排名相同,后面不跳。例如:1,1,1,2,3 等价sql的dense_rank()
first——值相同,排名不同,根据出现顺序。例如:1,2,3,4 等价于sql的row_number()over()
min——值相同,排名相同,向后跳跃。例如:1,2,2,4
max——值相同,排名相同,向后跳跃。例如:1,3,3,4 等价于sql的rank()