添加到 DynamoDB 流的额外值是什么?如何删除它们?

What are the extra values added to DynamoDB streams and how do I remove them?

我正在使用 DynamoDB 流通过 Lambda 将数据同步到 Elasticsearch

数据格式(来自 https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.Lambda.Tutorial.html)如下所示:

"NewImage": {
                "Timestamp": {
                    "S": "2016-11-18:12:09:36"
                },
                "Message": {
                    "S": "This is a bark from the Woofer social network"
                },
                "Username": {
                    "S": "John Doe"
                }
            },

所以两个问题。

  1. 流附加的 "S" 是什么。我假设它是指示字符串或流,但我找不到任何文档。

  2. 是否可以选择将其从流中排除,或者我是否必须在我的 lambda 函数中编写代码才能将其删除?

您看到的是 DynamoDB Data Type Descriptors。这就是数据在 DynamoDB 中的存储方式(或者至少是通过低级 API 公开数据的方式)。有多种语言的 SDK 可以将其转换为 JSON。

Python:https://boto3.amazonaws.com/v1/documentation/api/latest/_modules/boto3/dynamodb/types.html

'TypeSerializer'

deserializer = boto3.dynamodb.types.TypeDeserializer()
dic = {key: deserializer.deserialize(val) for key,val in record['dynamodb']['NewImage'].items()}

def decimal_default(obj):
    if isinstance(obj, decimal.Decimal):
        return float(obj)
    raise TypeError

json.dumps(dic, default=decimal_default)

如果您想在 elasticsearch 中建立索引,您必须执行另一个 json.loads() 以转换为 Python 字典。

S 表示属性的值只是标量字符串 (S) 属性类型。每个 DynamoDB 项目属性的键名称始终是一个字符串,但属性值不一定是标量字符串。 'Naming Rules and Data Types' 详细说明了每个属性数据类型。字符串是一种标量类型,不同于文档类型或集合类型。

流记录有不同的视图,但是没有流视图省略项目的属性值代码并提供属性值。每个可能的 StreamViewType 都在“Capturing Table Activity with DynamoDB streams”中进行了解释。

玩得开心!