GVKun编程网logo

Python Boto3 DynamoDB - 如何解析映射值类型?(python的映射)

3

在这里,我们将给大家分享关于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的映射)

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" } } }} 我应该如何解析它?

Cloud Console screenshot

换句话说,我应该将它作为地图还是将“user_level”和“user_xp”分别存储为单个值?

解决方法

换句话说,我应该将它作为地图还是将“user_level”和“user_xp”分别存储为单个值?

仅凭这一个示例就很难进行调用。如果您的项目通常具有 user_leveluser_xp,我会将其保留为单独的属性。

这会在以后为您提供更多选择,例如您可以稍后根据这些属性创建 Global Secondary Indices。正如您注意到的那样,它也更易于阅读和书写,然后是单个 map

AWS Boto3 DynamoDB 分页器

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 boto3 ResourceNotFoundException:调用 PutItem 操作时出错:

我是 AWS 和 DynamoDB 的新手,我正在尝试将数据发送到表。

我正在运行此代码:

  1. import boto3
  2. db = boto3.resource(''dynamodb'')
  3. table = db.Table(''Whales'')
  4. table.put_item(
  5. Item={
  6. "id": "1573138502","transaction_type": "transfer",})

我收到此错误:

  1. Traceback (most recent call last):
  2. File "/Users/---/Desktop/---/---/test.py",line 6,in <module>
  3. table.put_item(
  4. File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/boto3/resources/factory.py",line 520,in do_action
  5. response = action(self,*args,**kwargs)
  6. File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/boto3/resources/action.py",line 83,in __call__
  7. response = getattr(parent.Meta.client,operation_name)(*args,**params)
  8. File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/botocore/client.py",line 357,in _api_call
  9. return self._make_api_call(operation_name,kwargs)
  10. File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/botocore/client.py",line 676,in _make_api_call
  11. raise error_class(parsed_response,operation_name)
  12. 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?

如何解决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 种类型的目的地

  1. SQS 队列(在这种情况下可以是 FIFO)
  2. SNS 话题
  3. 事件桥
  4. 另一个 Lambda 函数本身。

节省了围绕服务的大量移动,并且很容易实现集成。

AWS Lambda Boto3 DynamoDB 并发

AWS Lambda Boto3 DynamoDB 并发

如何解决AWS Lambda Boto3 DynamoDB 并发

我正在尝试使用 concurrent.futures 从 AWS DynamoDB 异步检索项目以缩短功能时间。

  1. def retrieve_dynamo_item(dynamo_tablename,key):
  2. dynamodb = boto3.resource(''dynamodb'')
  3. dynamo_table = dynamodb.Table(dynamo_tablename)
  4. dynamo_result = dynamo_table.get_item(Key=key)
  5. return dynamo_result.get(''Item'')
  6. def lambda_handler(event,context):
  7. dynamo_queries = ## code
  8. with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
  9. futures = [executor.submit(retrieve_dynamo_item,dynamo_table,key) for dynamo_table,key in dynamo_queries]
  10. final_result = []
  11. for f in concurrent.futures.as_completed(futures):
  12. if f.result():
  13. 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 并发的相关知识,请在本站搜索。

本文标签: