Azure Cosmos DB列数限制

时间:2018-07-26 22:49:22

标签: json azure storage azure-cosmosdb

Azure Table Service documentation指出实体(行)必须具有最多255个属性,据我理解,这意味着这些表最多可以具有255个列,这似乎是非常严格的。

两个问题:首先,Cosmos DB表存储是否有相同的限制?尽管仍然使用“实体”的语言,但我似乎找不到任何一种说明方式的文档。第二点(如果在Cosmos DB中应用相同的限制),是否有沿JSON in SQL Server的路线绕过此限制进行存储和查询的有用方法?

编辑:这是一些示例代码,试图将具有260个属性的实体写入Cosmos DB表存储中并引发错误。帐户名称和密钥等已被编辑

# Libraries
from azure.cosmosdb.table.tableservice import TableService
from azure.cosmosdb.table.models import Entity
import csv
import os


# Connect
## Table Storage
"""
access_key = 'access_key'
table_service = TableService(account_name='account_name', account_key= access_key)
"""
## Cosmos DB Table Storage
connection_string = "connection_string"
table_service = TableService(connection_string=connection_string)

# Create Table
if not table_service.exists('testTable'):
    table_service.create_table('testTable')

length = 260
letters = [chr(i) for i in range(ord('a'), ord('z') + 1)]
keys = [a + b + c for a in letters for b in letters for c in letters][:length] 
values = ['0' * (8 - len(str(i))) + str(i) for i in range(length)]
entity = dict(zip(keys, values))
entity['PartitionKey'] = 'TestKey'
entity['RowKey'] = '1'
table_service.insert_entity('testTable', entity)

这将引发“ ValueError:该实体包含的属性超出了允许的范围。”

2 个答案:

答案 0 :(得分:1)

  

首先,Cosmos DB表存储是否有相同的限制?

如您所说,基于Azure Table storage limits,表实体中的最大属性数为255。但是,我只是在Azure Cosmos DB limits中找到下面的语句。

  

Azure Cosmos DB是一个全球规模的数据库,其中吞吐量和   可以扩展存储以处理您的应用程序所需的任何内容。如果   您对Azure Cosmos DB提供的规模有任何疑问,   请发送电子邮件至askcosmosdb@microsoft.com。

根据我的测试(我很累将260个属性添加到实体中),Azure Cosmos DB Table API接受属性超过255个。

enter image description here

如果您想获得官方回复,可以将电子邮件发送到上述地址。

  

有什么有用的方法可以绕过此限制进行存储和查询,   在SQL Server中遵循JSON的原则?

如果要存储和查询json格式的数据,建议您使用cosmos db SQL API。它具有通用性和灵活性,您可以参考doc

此外,如果您的数据现在存储在sql server数据库中。您可以使用Migration Tool将数据导入cosmos db。或者,您可以Azure Data Factory进行更多的自定义传输。

希望它对您有帮助。

答案 1 :(得分:1)

由于这在Google搜索中非常流行:截至目前为255(如果加密,则为-2)

我刚刚使用pytest进行了快速测试:

from azure.cosmosdb.table import TableService
field_number = 250
entity = get_dummy_dict_entry_with_many_col(field_number)
for x in range(field_number, 1000):
    print("Adding entity with {} elements.".format(len(entity)))
    table_service.insert_entity(my_test_table_name, entity)
    field_number += 1
    entity["Field_nb_{}".format(field_number)] = field_number
    entity["RowKey"] += str(field_number)

并在“ def _validate_entity(entity,crypto = None):”中出现异常

# Two properties are added during encryption. Validate sufficient space
max_properties = 255
if encrypt:
    max_properties = max_properties - 2  
# Validate there are not more than 255 properties including Timestamp
    if (len(entity) > max_properties) or (len(entity) == max_properties and 'Timestamp' not in entity):
>           raise ValueError(_ERROR_TOO_MANY_PROPERTIES)
E           ValueError: The entity contains more properties than allowed.