如何使用 boto3 对 dynamodb 中的数据进行排序并获得具有最大值的结果?
How To sort data in dynamodb with boto3 and get results with greatest values?
我有一本书 table,我想买 5 本最贵的书!就像我们在 MySQL 中所做的那样:SELECT * FROM (SELECT * FROM Books ORDER BY Price DESC) Books LIMIT 5
一般来说,DynamoDB 并非旨在对 整个 table 进行排序。尽管您可以 Scan
整个 table,但它们将以看似随机的顺序显示,而不是按任何熟悉的键排序。 DynamoDB documentation 说明了为什么会这样:
DynamoDB uses the partition key value as input to an internal hash function. The output from the hash function determines the partition (physical storage internal to DynamoDB) in which the item will be stored. All items with the same partition key value are stored together, in sorted order by sort key value.
遗憾的是,Scan
操作的文档没有解释这对扫描结果排序的影响。基本上,Scan
无法对数据库的所有分区进行全局排序(可能有数十亿个并且分布在许多不同的服务器之间)并且每个服务器只能看到分区的一个子集,按此排序伪随机散列函数排序,因此您在扫描中看到的排序受此影响。
DynamoDB 所做的 允许您使用 附加 sort key(除了分区键)。排序键将允许您检索共享按所选排序键排序的相同分区键的所有项目。但它仍然不是数据库中的所有项目 - 只是一个分区中的项目。
当然,您可以通过将所有项目放在一个分区中来“作弊”,然后对它们进行排序。这适用于小型数据库,但不适用于大量数据。 DynamoDB officially limits 单个分区的性能达到 3,000 RCU 和 1,000 WCU(基本上是每秒读写),因此可扩展的数据库需要有很多分区 - 而不是只有一个。
我有一本书 table,我想买 5 本最贵的书!就像我们在 MySQL 中所做的那样:SELECT * FROM (SELECT * FROM Books ORDER BY Price DESC) Books LIMIT 5
一般来说,DynamoDB 并非旨在对 整个 table 进行排序。尽管您可以 Scan
整个 table,但它们将以看似随机的顺序显示,而不是按任何熟悉的键排序。 DynamoDB documentation 说明了为什么会这样:
DynamoDB uses the partition key value as input to an internal hash function. The output from the hash function determines the partition (physical storage internal to DynamoDB) in which the item will be stored. All items with the same partition key value are stored together, in sorted order by sort key value.
遗憾的是,Scan
操作的文档没有解释这对扫描结果排序的影响。基本上,Scan
无法对数据库的所有分区进行全局排序(可能有数十亿个并且分布在许多不同的服务器之间)并且每个服务器只能看到分区的一个子集,按此排序伪随机散列函数排序,因此您在扫描中看到的排序受此影响。
DynamoDB 所做的 允许您使用 附加 sort key(除了分区键)。排序键将允许您检索共享按所选排序键排序的相同分区键的所有项目。但它仍然不是数据库中的所有项目 - 只是一个分区中的项目。
当然,您可以通过将所有项目放在一个分区中来“作弊”,然后对它们进行排序。这适用于小型数据库,但不适用于大量数据。 DynamoDB officially limits 单个分区的性能达到 3,000 RCU 和 1,000 WCU(基本上是每秒读写),因此可扩展的数据库需要有很多分区 - 而不是只有一个。