gpt4 book ai didi

performance - 扫描 DynamoDB 表或查询二级全局索引或本地索引(什么是最佳解决方案)

转载 作者:行者123 更新时间:2023-12-02 04:36:18 25 4
gpt4 key购买 nike

我有一个名为“Users”的 AWS DynamoDB 表,其散列键/主键是“UserID”,其中包含电子邮件。它有两个属性,第一个称为“Daily Points”,第二个称为“TimeSpendInTheApp”。现在我需要在表上运行查询或扫描,这将给我得分最高的前 50 名用户和在应用程序中花费最多时间的前 50 名用户。现在这个查询将每天仅由 cron aws lambda 执行一次。我正在尝试为此查询或扫描找到最佳解决方案。对我来说,成本比速度/效率更重要。由于在点上维护辅助全局索引或本地索引可能是代价高昂的操作,因为我必须为这些索引分配读取和写入单元,我想避免这种情况。 “用户”表最多有 100,000 到 150,000 条记录,平均有 50,000 条记录。我最好的选择是什么?请提出建议。

我在想,我的第一个选择是,我可以在 Filter Expression 上扫描整个表以查找超过某些点(例如 5000)的记录,在扫描之后,如果找到 50 条或超过 50 条记录,则只需对值并取前 50 条记录。如果此扫描没有返回结果或返回的结果非常少,则减小 Filter Expression 值(例如 3000),然后再次执行相同的扫描操作。如果 Filter Expression 值(例如 2500)返回太多记录,如 5000 或更多,则减少 Filter Expression 值。这甚至可能吗,我想它还需要处理分页。在有 50,000 条记录的表上扫描是否可取?

任何意见或建议都会有所帮助。提前致谢。

最佳答案

首先,为上述用例创建索引并没有简化流程,因为它没有聚合或排序的解决方案。

我会将数据导出到 HIVE 并运行查询,而不是编写代码来确定结果,尤其是因为它将是每天只执行一次的批处理。

如下所示:-

创建 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

关于performance - 扫描 DynamoDB 表或查询二级全局索引或本地索引(什么是最佳解决方案),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42333929/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com