簡體   English   中英

如何使用 boto3(lambda) 對 AWS dynamodb 表進行分組並獲取分區鍵的最新值?

[英]how to group AWS dynamodb table and get latest value of partition key using boto3(lambda)?

我是 AWS dynamodb 的新手,lambda。我對 RDB(MySQL) 有很好的了解。

這是我的示例表

partitian key   sort key    attribute
Device  TimeStamp   REMARKS
D1  2022-12-12 12:13:14 hello
D1  2022-12-12 12:14:14 testing
D2  2022-12-12 12:18:14 hello
D2  2022-12-12 12:19:14 testing
D3  2022-11-12 12:13:14 hello
D3  2022-12-12 12:14:14 testing

我想使用查詢語句在 lambda function 中使用 python boto3 提取以下 output。

每個'partitian key'的最新時間戳值 Output

D1  2022-12-12 12:14:14 testing
D2  2022-12-12 12:19:14 testing
D3  2022-12-12 12:14:14 testing

我嘗試使用 aws lambda 教程,但我可以使用掃描方法獲取所有數據

為此,您需要為每個設備發出一個Query並設置ScanIndexForward=FalseLimit=1

但是,例如,如果您需要所有設備的最新信息,則需要您創建一個全球二級索引 (GSI)。 它還要求您為每個設備保留一個“元”記錄,這將是最新的項目。

pk 斯克 屬性 gsi_pk gsi_sk
峰值 斯克 評論 gsi_pk gsi_sk
D1 2022-12-12 12:13:14 你好
D1 2022-12-12 12:14:14 測試
D1 測試 D1_最新 2022-12-12 12:14:14
D2 2022-12-12 12:18:14 你好
D2 2022-12-12 12:19:14 測試
D2 測試 D2_最新 2022-12-12 12:19:14
D3 2022-11-12 12:13:14 你好
D3 2022-12-12 12:14:14 測試
D3 測試 D3_最新 2022-12-12 12:14:14

現在,您的 GSI 將具有Meta分區鍵,並且將僅保存您需要的信息:

gsi 分區鍵 gsi 排序鍵 屬性 gsi_pk
pk gsi_sk 評論 gsi_pk
D1 2022-12-12 12:14:14 測試 D1_最新
D2 2022-12-12 12:19:14 測試 D2_最新
D3 2022-12-12 12:14:14 測試 D3_最新

這將使您能夠有效地Scan GSI 以獲取所需的項目。 但是,它需要您的寫入才能使用事務。 對於您添加的每個最新設備,您還需要更新元數據項,以便 GSI 也更新為最新值。

使用像 Lee 建議的 GSI 是在您想要批量檢索與特定特征匹配的項目的情況下采用的一般方法。 您在屬性中標記具有該特征的項目,並將該屬性用作 GSI 分區鍵。 然后對 GSI 進行預過濾。

在這種情況下,我認為這有點棘手,因為當一個項目獲得特性(最新的)時,另一個必須失去它(不再是最新的),如果您同時有很多潛在的寫入,這需要兩次寫入和這兩者之間的協調相同的項目集合。 正如 Lee 所說,您可能想要使用事務,這意味着 2 次寫入的成本是 2 倍 = 4 個 WCU。

還有別的辦法嗎? 在這種情況下的最佳選擇取決於您未指定的細節。 一件物品有多大? 他們多久更新一次? 多個客戶端同時寫入同一個項目集合的頻率是多少? 您多久進行一次批量查詢? 您的規模是否以成本為重,或者成本微不足道並且您想要優化以簡化操作? (我希望關於 DynamoDB 的每個 StackOverflow 問題都包括這些事實!)

一種可行的設計(如果項目數據往往很小,並且您希望以更高的讀取成本為代價來降低寫入成本)是將一組值存儲在單個項目中。 您可以通過直接附加到數組來安全地添加新值(只要數據集保持在 1 KB 以下,這將僅花費 1 個寫入單元,如果 1-2 KB 則花費 2 個寫入單元,等等)。 因此,與更新事務中的兩個項目相比,寫入成本節省了 4 倍。 然后您可以掃描表格,對於每個項目,讓客戶端從數組中拉出最后一個項目。 掃描將返回更多數據,因此批量讀取的成本會更高一些。 這就是設計選擇取決於用途的原因。

如果我們假設您想要存儲每個項目的最后 N 個數據值,那么這是一個特別好的方法,因為否則您必須插入、刪除舊的最新標志並刪除最舊的記錄。 在這里,您將讀取項目、根據需要更改數組、編寫新版本並使用樂觀鎖定來處理並發。 1 個 WCU 而不是 3 個,或者實際上是 6 個(如果必須使用事務)。

換句話說:“這取決於”

暫無
暫無

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

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