簡體   English   中英

SQL 部分訂購結果

[英]SQL partially order results

我在 Amazon Athena(Presto 引擎)中有一個表,其中包含一些用戶事件,其中包括 userId (VARCHAR) 和 ts (timestamp, BIGINT) 列。 表很大,幾億條記錄。 我想創建一個按 ts 列對事件進行排序的查詢。 我很快發現我不能使用全局ORDER BY ts ,因為這意味着所有 ts 值都應該存儲在單個工作節點的 memory 中,這會導致內存不足類型錯誤。

關鍵是實際上我不需要對這些事件進行全局排序,如果它們針對單個用戶 ID 進行排序就足夠了。 我還嘗試使用復合查詢,其中外部查詢獲取所有唯一用戶標識,內部查詢使用WHERE userid = current_userid子句,但由於我有大約 50k 個不同的用戶標識,因此該查詢運行時間太長。 (同樣的事情JOIN一起查詢的結果描述here )。 我正在尋找一些 sql 構造,它僅對行進行部分排序,例如ORDER BY ts OVER (PARTITION BY userid) (此子句無效)。

您似乎正在尋找:

ORDER BY RANK() OVER (PARTITION BY userid ORDER BY ts)

但是,我不確定這是否真的會限制你們工人的 memory 消費。 您需要對此進行測試。

我很快發現我不能使用全局 ORDER BY ts,因為這意味着所有 ts 值都應該存儲在單個工作節點的 memory 中,這會導致內存不足類型錯誤

Presto 支持分布式排序已有一年多了(由 Starburst 提供)。 分布式排序消除了將所有數據放入一個節點的 memory 的需要,因此允許對排序操作進行線性縮放。 您擁有的節點越多,您可以排序的數據就越多,而不會影響性能(不涉及磁盤/存儲)。

我不認為有一種方法可以強制舊的 Presto 版本有效地進行總排序而不將所有數據放在一個節點的 memory 中。 因此,在 Athena 原生支持分布式排序之前,您無法在用戶端進行補償。

您可以從https://trino.io/download.html獲取最新的 Presto 版本

由於您在 AWS 上,因此您可以使用Starburst Presto for AWS在 Amazon 上進行一鍵式(好的,實際上是“幾次點擊”)部署。 (我來自星爆)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM