2

我有名爲「Users」的AWS DynamoDB表,其中的哈希鍵/主鍵是包含電子郵件的「UserID」。它有兩個屬性,第一個叫做「Daily Points」,第二個叫「TimeSpendInTheApp」。現在我需要在桌面上運行一個查詢或掃描,這將使我獲得最高分的前50名用戶和在應用程序中花費最多時間的前50名用戶。現在這個查詢將每天由cron aws lambda執行一次。我正在嘗試爲此查詢或掃描找到最佳解決方案。對我而言,成本比速度/效率最重要。由於維護二級全局索引或點上的本地索引可能是昂貴的操作,因爲我必須爲這些索引分配讀取和寫入單位,這是我想要避免的。 「用戶」表格最多有100,000到150,000條記錄,平均來說它將有50,000條記錄。我最好的選擇是什麼?請建議。掃描DynamDB表或查詢輔助全局索引或本地索引(什麼是最佳解決方案)

我在想,我的第一個選擇是,我可以掃描過濾表達式上的某些點(例如5000)以上的記錄的整個表格,在此掃描後,如果找到50個或50個以上的記錄,數值並取前50條記錄。如果此掃描結果不是或結果非常少,則減小濾波器表達式值(例如3000),然後再次執行相同的掃描操作。如果篩選表達式值(例如2500)返回的記錄太多,如5000或更多,則減少篩選表達式值。這甚至是可能的,我想它也需要處理分頁。在具有50,000條記錄的表上掃描是否可取?

任何意見或建議將有所幫助。提前致謝。

回答

0

首先,爲上述用例創建索引不會簡化該過程,因爲它沒有聚合或排序的解決方案。

我會將數據導出到HIVE並運行查詢,而不是編寫代碼來確定結果,特別是因爲它將成爲每天只執行一次的批處理。

類似下面: -

創建蜂巢表: -

CREATE EXTERNAL TABLE hive_users(userId string, dailyPoints bigint, timeSpendInTheApp bigint) 
STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' 
TBLPROPERTIES ("dynamodb.table.name" = "Users", 
"dynamodb.column.mapping" = "userId:UserID,dailyPoints:Daily_Points,timeSpendInTheApp:TimeSpendInTheApp"); 

查詢: -

SELECT dailyPoints, userId from hive_users sort by dailyPoints desc; 
SELECT timeSpendInTheApp, userId from hive_users sort by timeSpendInTheApp desc; 

Hive Reference

相關問題