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

时间:2017-02-19 22:56:38

标签: performance amazon-dynamodb aws-lambda query-performance nosql

我有名为“Users”的AWS DynamoDB表,其哈希键/主键是“UserID”,由电子邮件组成。它有两个属性,首先称为“每日点”,第二个称为“TimeSpendInTheApp”。现在我需要在桌面上运行查询或扫描,这将为我提供排名最高的50位用户和排名前50位的用户,这些用户在应用中花费的时间最多。现在这个查询每天只会被cron aws lambda执行一次。我正在尝试为此查询或扫描找到最佳解决方案。对我来说,成本比速度/效率最重要。由于维护次要全局索引或点上的本地索引可能是昂贵的操作,因为我必须为这些索引分配读取和写入单元,我想避免。 “用户”表最多有100,000到150,000条记录,平均而言将有50,000条记录。我最好的选择是什么?请建议。

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

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

1 个答案:

答案 0 :(得分:0)

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

我会将数据导出到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