Yal*_*man 4 python amazon-web-services amazon-dynamodb aws-cli
我正在寻找使用 python 的 boto3 模块向 dynamodb 批量写入项目,我得到了这个。这是我第一次使用 aws cli 或 boto3。文档说当存在空值和可能不正确的数据类型时会发生验证异常错误,但我已经玩过所有这些并且它似乎不起作用。
dynamodb 是否只喜欢一次写入 25 个项目?如果是这样,我如何控制这些批次?
我的请求:
client = boto3.client('dynamodb')
response = client.batch_write_item(RequestItems=batch_dict)
Run Code Online (Sandbox Code Playgroud)
batch_dict 的顶部:
{'scraper_exact_urls': [{'PutRequest': {'Item': {'Sku': {'S': 'T104P3'},
'pps_id': {'N': '427285976'},
'scraper_class_name': {'S': 'scraper_class_name'},
'store_id': {'N': '1197386754'},
'updated_by': {'S': 'user'},
'updated_on': {'N': '1480714223'},
'updated_url': {'S': 'http://www.blah.com'}}}},
{'PutRequest': {'Item': {'Sku': {'S': 'T104P3'},
'pps_id': {'N': '427285976'},
'scraper_class_name': {'S': 'scraper_class_name'},
'store_id': {'N': '1197386754'},
'updated_by': {'S': 'user'},
'updated_on': {'N': '1480714223'},
'updated_url': {'S': 'http://www.blah.com'}}}},....
Run Code Online (Sandbox Code Playgroud)
架构:
属性:“pps_id”=>\Aws\DynamoDb\Enum\Type::NUMBER、“sku”=>\Aws\DynamoDb\Enum\Type::STRING、“scraper_class_name”=>\Aws\DynamoDb\Enum\Type: :STRING, "store_id"=>\Aws\DynamoDb\Enum\Type::NUMBER, "updated_url"=>\Aws\DynamoDb\Enum\Type::STRING, "updated_by"=>\Aws\DynamoDb\Enum\Type ::STRING, "updated_on"=>\Aws\DynamoDb\Enum\Type::NUMBER, 字段: "pps_id", "scraper_class_name",
错误:
ClientError: An error occurred (ValidationException) when calling the BatchWriteItem operation: 1 validation error detected: Value .... Map value must satisfy constraint: [Member must have length less than or equal to 25, Member must have length greater than or equal to 1]
Run Code Online (Sandbox Code Playgroud)
BatchWriteItem API 一次处理 25 个项目。您可以使用以下改编自非复制批处理问题的代码,在 25 个项目块上调用 BatchWriteItem
def batch(iterable, n=1):
l = len(iterable)
for ndx in range(0, l, n):
yield iterable[ndx:min(ndx + n, l)]
client = boto3.client('dynamodb')
for x in batch(batch_dict['scraper_exact_urls'], 25):
subbatch_dict = {'scraper_exact_urls': x}
response = client.batch_write_item(RequestItems=subbatch_dict)
Run Code Online (Sandbox Code Playgroud)