在这里,我们将给大家分享关于PythonBoto3DynamoDB-如何解析映射值类型?的知识,让您更了解python的映射的本质,同时也会涉及到如何更有效地AWSBoto3DynamoDB分页器、A
在这里,我们将给大家分享关于Python Boto3 DynamoDB - 如何解析映射值类型?的知识,让您更了解python的映射的本质,同时也会涉及到如何更有效地AWS Boto3 DynamoDB 分页器、AWS dynamodb boto3 ResourceNotFoundException:调用 PutItem 操作时出错:、AWS DynamoDB:如何订购使用 DynamoDB Stream 触发的 Lambda?、AWS Lambda Boto3 DynamoDB 并发的内容。
本文目录一览:- Python Boto3 DynamoDB - 如何解析映射值类型?(python的映射)
- AWS Boto3 DynamoDB 分页器
- AWS dynamodb boto3 ResourceNotFoundException:调用 PutItem 操作时出错:
- AWS DynamoDB:如何订购使用 DynamoDB Stream 触发的 Lambda?
- AWS Lambda Boto3 DynamoDB 并发
Python Boto3 DynamoDB - 如何解析映射值类型?(python的映射)
如何解决Python Boto3 DynamoDB - 如何解析映射值类型?
我以这种格式将值存储在我的 dynamodb 数据库中
{"user_id":123456789,"user_xp_stats":{"user_level":15,"user_xp":12670}}
在我为特定用户的“xp_stats”请求 get_item 后,我得到一个像这样的对象:
{ "M" : { "M" : { "user_level" : { "N" : "1" },"user_xp" : { "N" : "8.1" } } }}
我应该如何解析它?
换句话说,我应该将它作为地图还是将“user_level”和“user_xp”分别存储为单个值?
解决方法
换句话说,我应该将它作为地图还是将“user_level”和“user_xp”分别存储为单个值?
仅凭这一个示例就很难进行调用。如果您的项目通常具有 user_level
和 user_xp
,我会将其保留为单独的属性。
这会在以后为您提供更多选择,例如您可以稍后根据这些属性创建 Global Secondary Indices。正如您注意到的那样,它也更易于阅读和书写,然后是单个 map
。
AWS Boto3 DynamoDB 分页器
如何解决AWS Boto3 DynamoDB 分页器
我一直在研究 AWS Boto3 分页器。 问题是无论我在 PaginationConfig 中使用什么,我都没有在该字段中获得 NextToken
项。 例如,我知道我的查询返回 22 个项目,但即使我将 MaxItems=10
设置为 10 和 PageSize=5
,API 也不会返回 NextToken
供我使用用于分页。 这是我使用的:
response_iterator = paginator.paginate(
TableName=<myTableName>,Select=''ALL_ATTRIBUTES'',IndexName=<IndexName>,KeyConditionExpression="ApplicationId = :v_app_id",ExpressionAttributeValues={
":v_app_id": {"S": <SomeValue>}
},PaginationConfig={
''MaxItems'': 10,''PageSize'': 5
}
)
然后我会用它来获取所有页面:
pages = []
for page in response_iterator:
pages.append(page)
但是没有一个页面会有 NextToken
键。 有没有人找到解决这个问题的方法?
AWS dynamodb boto3 ResourceNotFoundException:调用 PutItem 操作时出错:
如何解决AWS dynamodb boto3 ResourceNotFoundException:调用 PutItem 操作时出错:
我是 AWS 和 DynamoDB 的新手,我正在尝试将数据发送到表。
我正在运行此代码:
import boto3
db = boto3.resource(''dynamodb'')
table = db.Table(''Whales'')
table.put_item(
Item={
"id": "1573138502","transaction_type": "transfer",})
我收到此错误:
Traceback (most recent call last):
File "/Users/---/Desktop/---/---/test.py",line 6,in <module>
table.put_item(
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/boto3/resources/factory.py",line 520,in do_action
response = action(self,*args,**kwargs)
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/boto3/resources/action.py",line 83,in __call__
response = getattr(parent.Meta.client,operation_name)(*args,**params)
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/botocore/client.py",line 357,in _api_call
return self._make_api_call(operation_name,kwargs)
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/botocore/client.py",line 676,in _make_api_call
raise error_class(parsed_response,operation_name)
botocore.errorfactory.ResourceNotFoundException: An error occurred (ResourceNotFoundException) when calling the PutItem operation: Requested resource not found
我安装了 boto3,我使用 aws cli 标识了自己,我还尝试从 AWS Cloud9 EC2 运行代码,但它没有用,同样的错误。
我无法从 Python 向数据库发送任何内容,我不明白问题出在哪里或导致问题的原因。
解决方法
您的 DynamoDB 表很可能位于与 ~/.aws/config
中指定的区域不同的区域。
尝试 cat ~/.aws/config
并检查您正在连接的区域。即us-east-1
。
使用 AWS 控制台或其他 CLI 工具验证您的 DynamoDB 是否在同一区域。
据我所知,您的代码在语法上不应该是错误的。
AWS DynamoDB:如何订购使用 DynamoDB Stream 触发的 Lambda?
如何解决AWS DynamoDB:如何订购使用 DynamoDB Stream 触发的 Lambda?
我已经启用了我的表的 DynamoDB Streaming,并且有两个 lambda 与它相关联。每当 DynamoDB 表通过 dynamo 触发器发生变化时,这两个触发器都会触发。
问题: Lambda 的两个数据都相应地插入到两个 RDS 表中。就像 Lambda-one 插入 table-one 和 Lambda-two 插入 table-2。 表一主键是表二中的外键。
因此,每当两个 lambda 都触发 lambda-two 首先完成执行时,它会显示 外键约束 错误,因为 lambda-two 尝试将数据插入 table-two 中,但在此时间表一还没有主键。
所以我的问题是有什么方法可以通过 DynamoDB 订购 lambda 的触发?
解决方法
AWS Step Functions 是用于编排 Lambda 函数的完美 AWS 功能,专为此类工作流而构建。它确保后续功能的顺序执行,并提供处理错误的方法,例如如果某些功能失败,则回滚并保持一致性。
以下是分步演练:Create a Serverless Workflow with AWS Step Functions and AWS Lambda
话虽如此,如果您需要维护数据库中的参照完整性,使用单个 Lambda 函数将两条记录的创建包装到一个事务中可能会简单得多。在这种情况下,数据库本身将负责维护一致性。如果它应该是一个原子写操作,就没有理由将它分成两个函数。
,是否在内部实现了类似的东西。但我们没有通过 AWS Step Function 增加复杂性,而是使用了 AWS Lambda Destinations。支持 4 种类型的目的地
- SQS 队列(在这种情况下可以是 FIFO)
- SNS 话题
- 事件桥
- 另一个 Lambda 函数本身。
节省了围绕服务的大量移动,并且很容易实现集成。
AWS Lambda Boto3 DynamoDB 并发
如何解决AWS Lambda Boto3 DynamoDB 并发
我正在尝试使用 concurrent.futures 从 AWS DynamoDB 异步检索项目以缩短功能时间。
def retrieve_dynamo_item(dynamo_tablename,key):
dynamodb = boto3.resource(''dynamodb'')
dynamo_table = dynamodb.Table(dynamo_tablename)
dynamo_result = dynamo_table.get_item(Key=key)
return dynamo_result.get(''Item'')
def lambda_handler(event,context):
dynamo_queries = ## code
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
futures = [executor.submit(retrieve_dynamo_item,dynamo_table,key) for dynamo_table,key in dynamo_queries]
final_result = []
for f in concurrent.futures.as_completed(futures):
if f.result():
final_result += f.result().get(''result'')
然而,在部署和测试 lambda 函数时,性能似乎没有提高,但实际上比仅同步运行查询更糟糕。关于可能是什么原因的任何建议?
解决方法
正如 Oleksii 已经说过的,Lambda 的默认内存设置只会给你 1 个 CPU。所以并发有点难以实现。性能变慢可能是由于处理线程等的额外开销造成的。
下表包含了此时内存到 CPU 内核的映射(将来可能会更改)。
内存 | CPU 内核 |
---|---|
128 - 1769 | 1 |
1770 - 3538 | 2 |
3539 - 5307 | 3 |
5308 - 7076 | 4 |
7077 - 8845 | 5 |
8846 - 10240 | 6 |
例如,您可以将 Lambdas 内存增加到 2000MB,然后检查是否可以提高性能。
此外,我绝对建议使用批处理操作,而不仅仅是 GetItem
。
并行执行最有可能受到函数可用计算能力的影响。使用默认内存分配,您没有多少 CPU。请参阅此 answer 了解详情
今天关于Python Boto3 DynamoDB - 如何解析映射值类型?和python的映射的讲解已经结束,谢谢您的阅读,如果想了解更多关于AWS Boto3 DynamoDB 分页器、AWS dynamodb boto3 ResourceNotFoundException:调用 PutItem 操作时出错:、AWS DynamoDB:如何订购使用 DynamoDB Stream 触发的 Lambda?、AWS Lambda Boto3 DynamoDB 并发的相关知识,请在本站搜索。
本文标签: