有没有办法在查询 Cosmos Db 中对数据进行逻辑分区?就像您可以使用散列和模函数一样[关闭]

Posted

技术标签:

【中文标题】有没有办法在查询 Cosmos Db 中对数据进行逻辑分区?就像您可以使用散列和模函数一样[关闭]【英文标题】:Is there any way to logically partition data in Cosmos Db while quering them? like you can do with hashing and modulo functions [closed] 【发布时间】:2021-12-31 18:57:38 【问题描述】:

我需要运行一组从特定 cosmos db 容器获取数据的持久数据处理活动。我在容器中看不到可以帮助我在 azure 函数之间或多或少均匀分布负载的字段。我想知道是否有任何哈希函数可以让我使用 mod 函数进行经典分区,假设我决定从 Orchestrator 中运行 10 个活动并查询数据,例如

select * from c where hash(c.id) % 10 = functionNumber.

我知道它会对 10 个函数中的每一个函数进行一次完整扫描,但没关系,在这种情况下,均匀分布负载更为重要。它的持久性不是因为数据量大,而是因为数据处理的复杂性

【问题讨论】:

您的收藏目前在哪个分区上?数据处理会访问集合中的大部分文档吗?您的集合当前分布在多少个物理分区上?根据对这些问题的回答,您可以使用 Cosmos 触发函数,因为它使用更改源并且可以并行处理物理分区 我不完全确定您要做什么,但是...正如@MartinSmith 所提到的,更改提要可能是您的一个选择(并允许多个读者)。虽然没有神奇的哈希函数。或许可以研究一下 Spark 等分布式处理引擎? 也就是说:不幸的是,这个问题与书面的主题无关,因为它相当广泛且征求意见(实际上没有一个客观正确的答案)。 目前它按 id 分区,即 GUID。我不确定有多少物理分区,我无法控制,它是 Azure 中的 Cosmos Db,Azure 决定创建多少物理分区。即使我知道有 5 个,我不确定我是否可以在 sql 中访问它,并且它也可以及时更改。我试图让 10 个 azure 函数中的每一个读取单个容器的自己的数据切片,而不是重叠和均匀分布的切片。我认为这不是一个广泛的问题:这种 Cosmos SQL 功能是否存在。谢谢 好吧,实际上我能够使用模函数和 _ts 找到解决方案,它是 Cosmos Db 中的时间戳,所以我认为可以替换 hash() 函数,比如 10 个活动中的第 5 个活动:@ 987654322@所以我要结束这个问题了 【参考方案1】:

看起来不是 Cosmos SQL 一部分的按字段散列的替代方法我决定使用模函数和 _ts,它是 Cosmos Db 中的时间戳

例如,总共 10 个活动中的第 5 个活动将像这样查询数据:SELECT VALUE root FROM root WHERE (root["_ts"] % 10) = 5)

【讨论】:

以上是关于有没有办法在查询 Cosmos Db 中对数据进行逻辑分区?就像您可以使用散列和模函数一样[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

通过 MongoAPI 对 Azure Cosmos DB 进行聚合查询时出现意外错误

Azure Cosmos DB 如何按一系列值进行分组

如何使用 LINQ 针对 Azure Cosmos Document DB SQL API 有效地进行动态查询?

Blazor WASM 使用 Cosmos DB 而不是 SQL 来获取身份

在 Cosmos DB 中查询嵌套对象

有没有办法在 graphQL 中对查询进行分组?