amazon-web-services - 按距离排序查询需要读取整个数据集?
问题描述
要在 DynamoDB 中执行地理查询,AWS 中有一些库 ( https://aws.amazon.com/blogs/mobile/geo-library-for-amazon-dynamodb-part-1-table-structure/ )。但是要按距离对地理查询的结果进行排序,必须读取整个数据集,对吗?如果地理查询产生大量结果,则如果您按距离排序,则无法对其进行分页(在后端,而不是对用户),是吗?
解决方案
你是对的。要按与某个任意位置的距离对所有数据点进行排序,您必须从 DynamoDB 表中读取所有数据。
在 DynamoDB 中,您只能使用已存储在 DynamoDB 表中并用作表或其索引之一的排序键的预计算值对结果进行排序。如果您需要按距离固定位置的距离进行排序,那么您可以使用 DynamoDB 执行此操作。
可能的解决方法(有限制)
- TLDR;如果您只对距离任意点 X 公里以内的项目进行排序,这不是一个糟糕的问题。
这仍然涉及对内存中的数据点进行排序,但是通过产生不完整的结果(通过限制结果的最大范围)使问题变得更容易。
为此,您需要点 P 的 Geohash(从该点测量所有其他点的距离)。假设它是 A234311。然后,您需要选择合适的结果范围。让我们在这上面放一些数字以使其具体化。(我完全是在编造这些数字,因为实际数字与理解这些概念无关。)
A - represents a 6400km by 6400km area
2 - represents a 3200km by 3200km area within A
3 - represents a 1600km by 1600km area within A2
4 - represents a 800km by 800km area within A23
3 - represents a 400km by 400km area within A234
1 - represents a 200km by 200km area within A2343
1 - represents a 100km by 100km area within A23431
从图形上看,它可能如下所示:
View of A View of A23
|----------|-----------| |----------|-----------|
| | A21 | A22 | | | |
| A1 |-----|-----| | A231 | A232 |
| | A23 | A24 | | | |
|----------|-----------| |----------|-----------|
| | | | |A2341|A2342|
| A3 | A4 | | A233 |-----|-----|
| | | | |A2343|A2344|
|----------|-----------| |----------|-----------| ... and so on.
在这种情况下,我们的点 P 在 A224132 中。还假设我们想要得到 400km 内的排序点。A2343 是 400 公里乘 400 公里,因此我们需要从 A2343 及其所有8 个连接的邻居(A2341、A2342、A2344、A2334、A2332、A4112、A4121、A4122)加载结果。然后,一旦我们只加载了内存中的那些,然后您计算距离,对它们进行排序,并丢弃任何超过 400 公里的结果。
(您可以保留超过 400 公里的结果,只要用户/客户知道超过 400 公里,数据可能不完整。)
DynamoDB Geo 库使用的散列方法与Z-Order Curve非常相似— 您可能会发现熟悉该方法以及AWS 数据库博客关于 Z-Order Indexing for Multifaceted Queries 的第 1 部分和第 2部分会很有帮助在 DynamoDB 中。
推荐阅读
- javascript - 异步快速路由器功能到 MongoClient
- laravel - Laravel Snippets (v.1.13.0):关系问题(一对多,...)
- reactjs - 我想通过使用数据库中的值使列标题在反应 ag-grid 中动态化
- r - 使用拼凑排列多个地块时,如何将图例合并为地块大小的图?
- python - 查找列表中的列表中是否存在字符串
- deep-learning - 数据集的归一化,错误:输入的所有元素应介于 0 和 1 之间
- jquery - [Route: ] - Laravel 7 缺少必需的参数
- google-sheets - 如何从一列和相邻列中随机选择
- angular - 如何在 Ionic App 中使用 cypress、scrollTo?
- sql - 无法在 oracle sql 开发中使用数据透视函数