DynamoDb 批处理获取项和分区键和排序键



我尝试使用batchGetItem从表中返回多个项目的属性,但似乎它仅适用于分区键和范围键的组合,但是如果我想仅通过主键识别请求的项目怎么办? 唯一的方法是创建没有范围键的表吗?

// Adding items
$client->putItem(array(
'TableName' => $table,
'Item' => array(
'id'     => array('S' => '2a49ab04b1534574e578a08b8f9d7441'),
'name'   => array('S' => 'test1'),
'user_name'   => array('S' => 'aaa.bbb')
)
));
// Adding items
$client->putItem(array(
'TableName' => $table,
'Item' => array(
'id'     => array('S' => '4fd70b72cc21fab4f745a6073326234d'),
'name'   => array('S' => 'test2'),
'user_name'   => array('S' => 'aaaa.bbbb'),
'user_name1'   => array('S' => 'aaaaa.bbbbb')
)
));
$client->batchGetItem(array(
"RequestItems" => array(
$table => array(
"Keys" => array(
// hash key
array(
"id"  => array( 'S' => "2a49ab04b1534574e578a08b8f9d7441"),
// range key
"name" => array( 'S' => "test1"),
),
array(
// hash key
"id"  => array( 'S' => "4fd70b72cc21fab4f745a6073326234d"),
// range key
"name" => array( 'S' => "test2"),
),
)
)
)
));

根据官方文件:

http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.Partitions.html

如果表具有复合主键(分区键和排序键), DynamoDB 计算分区键的哈希值 方式如数据分布:分区键中所述 - 但它存储所有 具有相同分区键值的项的物理接近 一起,按排序键值排序。

使用Partition Key and Sort Key旁边的存储具有相同分区键值的所有项目物理上靠近在一起有什么好处?

根据官方文件:

单个操作最多可以检索 16 MB 的数据,其中可以包含 多达 100 个项目。 BatchGetItem 将返回部分结果,如果 超出响应大小限制,表已预配 超出吞吐量,或发生内部处理故障。

如果我需要超过 100个项目,如何处理请求? 只需遍历代码中的所有项目,每次请求 100 次,或者有另一种方法可以通过 AWS 开发工具包 DynamoDB 实现它?

表创建示例:

$client->createTable(array(
'TableName' => $table,
'AttributeDefinitions' => array(
array(
'AttributeName' => 'id',
'AttributeType' => 'N'      
),
array(
'AttributeName' => 'name',
'AttributeType' => 'S'
)
),
'KeySchema' => array(
array(
'AttributeName' => 'id',
'KeyType'       => 'HASH'
),
array(
'AttributeName' => 'name',
'KeyType'       => 'RANGE'
)
),
'ProvisionedThroughput' => array(
'ReadCapacityUnits'  => 5,
'WriteCapacityUnits' => 5
)
));

谢谢

更新 - 标记 B 的问题回答:

是的,

您可以创建没有范围键的索引。范围键是 完全可选。但是,即使您定义了范围键,它也是 可以选择将其包含在查询中。 您可以简单地指定哈希 键入查询以获取带有哈希键的所有项目,该哈希键将是 按基于范围键的顺序返回。

如果我在具有哈希键和范围键的表上的查询中仅指定哈希键,则会出现以下错误,如果我在没有范围键的表上的查询中仅指定哈希键,则可以正常工作。 请注意没有索引的表格。

An uncaught Exception was encountered
Type:        AwsDynamoDbExceptionDynamoDbException
Message:     Error executing "BatchGetItem" on "https://dynamodb.eu-central-1.amazonaws.com"; AWS HTTP error: Client error: `POST https://dynamodb.eu-central-1.amazonaws.com` resulted in a `400 Bad Request` response:
{"__type":"com.amazon.coral.validate#ValidationException","message":"The provided key element does not match the schema" (truncated...)
ValidationException (client): The provided key element does not match the schema - {"__type":"com.amazon.coral.validate#ValidationException","message":"The provided key element does not match the schema"}
Filename:    /var/app/vendor/aws/aws-sdk-php/src/WrappedHttpHandler.php

你问了很多问题,所以我会尝试分解它。(对不起,我无法用 php 代码片段回答这个问题)

我尝试使用 batchGetItem 返回多个项目的属性 从表中,但似乎它仅适用于 分区键和范围键,但如果我想标识 仅按主键请求的项目?唯一的方法是创建 没有范围键的表?

BatchGetItem 与多个 GetItem 调用相同。实质上,每次 GetItem 调用检索零个或一个项。 您为它提供要检索的项目的唯一键(主键)。如果您的表只有分区键,则这就是您指定的全部内容,否则是分区和范围键。 BatchGetItem 在向 DynamoDB 发出的一个请求中对 GetItem 调用进行批处理。

如果要查询给定分区键的多个项,则需要查看查询 API。

使用旁边的分区键和排序键有什么优势 以物理方式存储具有相同分区键值的所有项 靠得很近 ?

这是一个很难回答的问题,因为它在很大程度上取决于数据模型的唯一键。

我想到的一些优点是: 1. 排序键使您能够对该属性的数据进行排序(按升序或降序) 2.排序键具有更多的比较操作(即:大于,小于,之间,开头为等)。查看文档

如果我需要超过 100 个项目,如何处理请求? 只是循环 通过代码中的所有项目,每次请求100次或 还有另一种方法可以通过 AWS 开发工具包 DynamoDB 实现它?

如果请求的项目超过 100 个,BatchGetItem 将返回一个 ValidationException,并显示消息"BatchGetItem 调用请求的项目过多"。您需要循环浏览这些物品,一次 100 个才能获得所需的所有物品。请记住,还有 16MB 的大小限制,这意味着如果任何项目未处理,它们将在"未处理的项目"下的响应中返回。

如果 DynamoDB 返回任何未处理的项目,您应对这些项目重试批处理操作。但是,我们强烈建议您使用指数退避算法。如果立即重试批处理操作,则基础读取或写入请求仍可能由于对各个表的限制而失败。如果使用指数退避延迟批处理操作,则批处理中的各个请求更有可能成功。

本文档介绍了如何使用它。

但是如果我只想按主数据库识别请求的项目怎么办 钥匙?唯一的方法是创建没有范围键的表吗?

是的,您可以创建没有范围键的索引。范围键是完全可选的。但是,即使定义了范围键,也可以选择将其包含在查询中。只需在查询中指定哈希键即可获取带有哈希键的所有项目,该哈希键将根据范围键按顺序返回。

使用旁边的分区键和排序键有什么优势 以物理方式存储具有相同分区键值的所有项 靠得很近 ?

这两个字段组合在一起是您的主键,它保证了唯一性。范围/排序键还确定返回结果的顺序。

如果我需要超过100个项目,如何处理请求?

来自文档(强调我的):

可以为 单个操作为 100。此外,检索的项目数为 受 1 MB 大小限制的限制。如果响应大小限制为 超出或由于内部处理而返回部分结果 失败,Amazon DynamoDB返回"未处理的密钥"值,以便您可以 重试从下一项开始的操作以获取。

例如,即使您要求检索 100 个项目,但每个项目都 单个项目的大小为 50K,系统返回 20 个项目和一个 适当的"未处理的密钥">值,以便您可以获取下一页 结果。如有必要,应用程序需要自己的逻辑来 将结果页面组合成一组

因此,您需要检查结果的UnprocessedKeys值,并继续在应用程序中发出请求,直到没有更多的UnprocessedKeys

最新更新