SQL半序结果
我在AmazonAthena(一个Presto引擎)中有一些用户事件的表,其中包括userId(VARCHAR)和ts(timestamp,BIGINT)列。这张桌子相当大,有几亿张唱片。我想创建一个查询,按ts列对事件进行排序。我很快发现我不能使用全局SQL半序结果,sql,performance,amazon-web-services,presto,amazon-athena,Sql,Performance,Amazon Web Services,Presto,Amazon Athena,我在AmazonAthena(一个Presto引擎)中有一些用户事件的表,其中包括userId(VARCHAR)和ts(timestamp,BIGINT)列。这张桌子相当大,有几亿张唱片。我想创建一个查询,按ts列对事件进行排序。我很快发现我不能使用全局ORDER BY ts,因为这意味着所有ts值都应该存储在单个工作节点的内存中,这会导致内存不足类型错误 关键是,实际上我不需要对这些事件进行全局排序,如果为单个用户ID排序就足够了。我还尝试使用一个复合查询,其中外部查询获取所有唯一的useri
ORDER BY ts
,因为这意味着所有ts值都应该存储在单个工作节点的内存中,这会导致内存不足类型错误
关键是,实际上我不需要对这些事件进行全局排序,如果为单个用户ID排序就足够了。我还尝试使用一个复合查询,其中外部查询获取所有唯一的userid,而内部查询使用一个
where userid=current\u userid
子句,但由于我有大约50k个不同的userid,因此此查询运行的时间太长。(如前所述,将查询结果连接在一起的操作与此相同)。我正在寻找一些只部分使用对行排序的sql构造,类似于按ts排序(按用户ID划分)
(此子句无效)。您似乎在寻找:
ORDER BY RANK() OVER (PARTITION BY userid ORDER BY ts)
然而,我不确定这是否真的会限制你们工人的内存消耗。你需要测试一下
我很快发现我不能使用ts的全局顺序,因为这意味着所有ts值都应该存储在单个工作节点的内存中,这会导致内存不足类型错误
Presto支持分布式排序已经一年多了(由Starburst提供)。分布式排序无需将所有数据放在一个节点的内存中,因此允许对排序操作进行线性缩放。节点越多,可以排序的数据越多,而不会影响性能(不涉及磁盘/存储)
我不认为有任何方法可以强制较旧的Presto版本在不将所有数据放入一个节点内存的情况下有效地进行总排序。因此,在Athena本机支持分布式排序之前,您无法在用户端进行补偿
您可以从以下网站获得最新的Presto版本:
由于您在AWS上,所以可以使用在Amazon上进行一次单击(好的,实际上是“几次单击”)部署。(我来自Starburst)。问题是,查询末尾的
ORDER BY
子句将始终应用于结果集中的所有记录。您可能需要将结果集读入应用程序并在其中排序。或者,添加索引以加快排序速度。您能在这里包含您正在运行的实际查询吗?是的,我确认它没有减少内存消耗。。。现在,它尝试将结果集按来自RANK()