Какие дополнительные значения добавляются в потоки DynamoDB и как их удалить? - PullRequest
0 голосов
/ 22 февраля 2020

Я использую потоки DynamoDB для синхронизации c данных с Elasticsearch с использованием Lambda

Формат данных (от 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. Есть ли возможность исключить это из потока, или мне нужно написать код в моя лямбда-функция, чтобы удалить его?

Ответы [ 3 ]

1 голос
/ 22 февраля 2020

То, что вы видите, это DynamoDB Дескрипторы типов данных . Вот как данные хранятся в DynamoDB (или, по крайней мере, как они предоставляются через API низкого уровня). Существуют SDK на разных языках, которые преобразуют это в JSON.

0 голосов
/ 27 февраля 2020

S указывает, что значением атрибута является просто тип атрибута скалярной строки (S). Имя ключа каждого атрибута элемента DynamoDB всегда является строкой, хотя значение атрибута не обязательно должно быть скалярной строкой. « Правила именования и типы данных » подробно описывают каждый тип данных атрибута. Строка - это скалярный тип, который отличается от типа документа или типа набора.

Существуют различные представления записи потока, однако нет представления потока, в котором пропущен код значения атрибута элемента, а также предоставляется атрибут ценность. Каждый возможный StreamViewType объясняется в ' Захват табличной активности с потоками DynamoDB '.

Веселитесь!

0 голосов
/ 22 февраля 2020

Для 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)

Если вы хотите выполнить индексирование вasticsearch, вам нужно сделать еще один json .loads () для преобразования в Python словарь.

...