python - 如何解决 Azure CosmosDB 上仅出现在大数据集合上的查询问题?
问题描述
我正在尝试从包含MachineCollection
大量数据(58 GB 数据;索引大小 9 GB)的 CosmosDB 集合 ( ) 中读取数据。吞吐量设置为 1000 RU/s。该集合按序列号、读取位置(WestEurope、NorthEurope)、写入位置(WestEurope)进行分区。在我的阅读尝试的同时,MachineCollection
每 20 秒就会收到一次数据。
问题是我无法通过 Python 查询任何数据。如果我在 CosmosDB Data Explorer 上执行查询,我很快就会得到结果。(例如查询某个序列号)。
出于故障排除的目的,我创建了一个新的数据库 ( TestDB
) 和一个TestCollection
. 其中TestCollection
,有 10 个数据集MachineCollection
。如果我尝试通过 Python 从中读取,MachineCollection
它会成功并且我可以将数据保存到 CSV。
这让我想知道为什么在使用完全相同的属性配置 TestDB 和 TestCollection 时我无法从 MachineCollection 查询数据。
我已经尝试通过 Python 进行查询:
options['enableCrossPartitionQuery'] = True
Querying using PartitionKey: options['partitionKey'] = 'certainSerialnumber'
一直如此。适用于 TestCollection,但不适用于 MachineCollection。
非常感谢有关如何解决此问题的任何想法!
解决方案
首先,您需要知道的是 Document DB 对Response page size
. 此链接总结了其中一些限制:Azure DocumentDb 存储限制 - 它们到底是什么意思?
其次,如果要从 Document DB 中查询大数据,则必须考虑查询性能问题,请参考这篇文章:使用 Azure Cosmos DB 调优查询性能。
通过查看Document DB REST API,您可以观察到几个对查询操作有重大影响的重要参数:x-ms-max-item-count, x-ms-continuation.
据我所知,Azure 门户不会自动帮助您优化 SQL,因此您需要在 sdk 或 rest api 中处理此问题。
您可以设置Max Item Count的值并使用 对数据进行分页continuation token
。Document Db sdk 支持无缝读取分页数据。您可以参考下面的python代码片段:
q = client.QueryDocuments(collection_link, query, {'maxItemCount':10})
results_1 = q._fetch_function({'maxItemCount':10})
#this is a string representing a JSON object
token = results_1[1]['x-ms-continuation']
results_2 = q._fetch_function({'maxItemCount':10,'continuation':token})
您可以参考的另一个案例:如何为 Python 中 document_client 对象发送的 Cosmos DB 查询设置延续令牌?
推荐阅读
- python - CodingBat Python warmup-2 array123,单行解决方案不行
- c++ - 在 target_include_directories 的帮助下减少标题的长度
- java - ImageIO.write(img,"jpg",pathtosave) JAVA 不将图像文件保存到选定的文件路径
- nginx - Nginx - 如何将静态文件提供给特定的用户代理?
- reactjs - Chime SDK 视频无响应
- loops - 如何在 Julia 文档字符串中缩进?
- python - 如何更新 itertools 笛卡尔积
- python-3.x - 将数据读入两个单独的列表
- corda - 如果 StateRef 被消耗,我如何找到消耗它的事务?
- oracle - 是否有用于返回给定 schema.table 的以逗号分隔的列名列表的快速 PLSQL 函数?