Есть ли способ сделать это эффективно
Не в DynamoDB, этот вариант использования не тот, для которого он предназначен ...
Также обратите внимание, если только вы Вы говорите о га sh или ключе сортировки (таблицы или существующего индекса), у DDB нет столбцов.
Вы бы запустили Scan()
(в al oop, так как он возвращает только 1 МБ данных) ...
Затем обновляйте каждый элемент 1 за раз. (примечание может BatchUpdate из 10 элементов одновременно, но это сэкономит только сетевые накладные расходы .. все еще делает 10 отдельных обновлений)
Если рассматриваемый атрибут используется в качестве ключа в таблице или существующего индекса .. .то новый стол ваш единственный вариант. Вот хорошая статья со стратегией переноса рабочей таблицы.
- Создайте новую таблицу (назовем ее NewTable) с желаемой структурой ключей, LSI, GSI.
- Включение потоков DynamoDB в исходной таблице
- Свяжите лямбда-поток с потоком, который помещает запись в NewTable. (Эта лямбда должна обрезать флаг миграции на шаге 5)
- [ Необязательно ] Создайте GSI на исходной таблице, чтобы ускорить сканирование элементов. Убедитесь, что этот GSI имеет только атрибуты: первичный ключ и мигрированный (см. Шаг 5).
- Сканирование GSI, созданного на предыдущем шаге (или всей таблицы), и используйте следующий фильтр:
FilterExpression = "attribute_not_exists (Перенесено) «
Обновите каждый элемент в таблице с помощью флага переноса (ie:« Перенос »: {« S »:« 0 »}, который отправляет его в потоки DynamoDB (используя API UpdateItem, чтобы обеспечить потеря данных не происходит).
ПРИМЕЧАНИЕ Возможно, вы захотите увеличить единицы емкости записи в таблицу во время обновлений.
Лямбда соберет все элементы, обрежет флаг переноса и вставит sh в NewTable. Как только все элементы перенесены, переназначьте код в новую таблицу Удалите оригинальную таблицу, и лямбда-функция, когда все будет хорошо.