DynamoDB обновляет один столбец всех элементов - PullRequest
0 голосов
/ 08 января 2020

У нас огромная таблица DynamoDB (~ 4 миллиарда элементов), и один из столбцов - это какая-то категория (строка), и мы хотели бы сопоставить этот столбец с новым идентификатором category_id (целое число) или обновить существующий из строки к инт. Есть ли способ сделать это эффективно, не создавая новую таблицу и не заполняя ее с самого начала. Другими словами обновить существующую таблицу?

1 Ответ

1 голос
/ 08 января 2020

Есть ли способ сделать это эффективно

Не в DynamoDB, этот вариант использования не тот, для которого он предназначен ...

Также обратите внимание, если только вы Вы говорите о га sh или ключе сортировки (таблицы или существующего индекса), у DDB нет столбцов.

Вы бы запустили Scan() (в al oop, так как он возвращает только 1 МБ данных) ...

Затем обновляйте каждый элемент 1 за раз. (примечание может BatchUpdate из 10 элементов одновременно, но это сэкономит только сетевые накладные расходы .. все еще делает 10 отдельных обновлений)

Если рассматриваемый атрибут используется в качестве ключа в таблице или существующего индекса .. .то новый стол ваш единственный вариант. Вот хорошая статья со стратегией переноса рабочей таблицы.

  1. Создайте новую таблицу (назовем ее NewTable) с желаемой структурой ключей, LSI, GSI.
  2. Включение потоков DynamoDB в исходной таблице
  3. Свяжите лямбда-поток с потоком, который помещает запись в NewTable. (Эта лямбда должна обрезать флаг миграции на шаге 5)
  4. [ Необязательно ] Создайте GSI на исходной таблице, чтобы ускорить сканирование элементов. Убедитесь, что этот GSI имеет только атрибуты: первичный ключ и мигрированный (см. Шаг 5).
  5. Сканирование GSI, созданного на предыдущем шаге (или всей таблицы), и используйте следующий фильтр:
    FilterExpression = "attribute_not_exists (Перенесено) «
    Обновите каждый элемент в таблице с помощью флага переноса (ie:« Перенос »: {« S »:« 0 »}, который отправляет его в потоки DynamoDB (используя API UpdateItem, чтобы обеспечить потеря данных не происходит).

ПРИМЕЧАНИЕ Возможно, вы захотите увеличить единицы емкости записи в таблицу во время обновлений.

Лямбда соберет все элементы, обрежет флаг переноса и вставит sh в NewTable. Как только все элементы перенесены, переназначьте код в новую таблицу Удалите оригинальную таблицу, и лямбда-функция, когда все будет хорошо.
...