Presto无唯一键场景下如何实现稳定全局排序?
问题根因说明
你遇到的执行结果不稳定的问题,和表是否定义唯一键没有直接关系,核心原因是你窗口函数的排序逻辑存在歧义:
- 你的子查询已经过滤了
dt='2021-09-06',所有参与排序的行的dt值完全相同 - SQL标准没有规定排序键值重复的行的先后顺序,完全由引擎底层实现决定
- Hive底层基于批处理引擎(MapReduce/Tez/Spark)实现,文件读取顺序、shuffle排序逻辑固定,所以重复排序键的行返回顺序每次一致
- Presto是MPP分布式架构,不同worker节点读取数据分片、处理数据的速度存在波动,排序键值完全相同时,先到达排序节点的行会排在更前的位置,因此每次执行返回的顺序都不固定
无唯一键场景下实现稳定全局排序的方案
可以实现,不需要表有显式定义的唯一键,只需要在ORDER BY子句中补充足够的字段,确保排序字段的组合可以唯一区分每一行即可。
示例修改后的SQL:
SELECT * FROM ( SELECT row_number() over(ORDER BY T.dt, T.event_time, T.uid, T.log_id) as row_num,T.* FROM (select * from ods.test_table where dt='2021-09-06') as T) TT WHERE TT.row_num BETWEEN 1 AND 10
注:需确保你补充到ORDER BY后的字段组合,能够唯一标识表中的每一行,即可获得每次执行完全一致的稳定排序结果
如果表存在完全重复的行(所有字段值都相同),则无法通过排序逻辑区分这类行,业务上通常无需关注这类完全相同行的先后顺序。
内容的提问来源于stack exchange,提问作者slo
相关产品推荐
相关产品推荐

