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

相关问题