Экспорт данных из DynamoDB

Можно ли экспортировать данные из таблицы DynamoDB в каком-либо формате?

Конкретный вариант использования заключается в том, что я хочу экспортировать данные из своей производственной базы данных Dynamodb и импортировать эти данные в свой локальный экземпляр Dynamodb, чтобы мое приложение могло работать с локальной копией данных вместо производственных данных.

Я использую ссылку в качестве локального экземпляра DynamoDB.


person Kristian Ačkar    schedule 19.09.2013    source источник


Ответы (19)


Это экспортирует все элементы как документы jsons.

aws dynamodb scan --table-name TABLE_NAME > export.json

Этот сценарий будет читать из удаленной таблицы Dynamodb и импортировать в локальную полную таблицу.

TABLE=YOURTABLE
maxItems=25
index=0

DATA=$(aws dynamodb scan --table-name $TABLE --max-items $maxItems)
((index+=1)) 
echo $DATA | jq ".Items | {\"$TABLE\": [{\"PutRequest\": { \"Item\": .[]}}]}" > inserts.jsons
aws dynamodb batch-write-item --request-items file://inserts.jsons --endpoint-url http://localhost:8000


nextToken=$(echo $DATA | jq '.NextToken')
while [[ "${nextToken}" != "" ]]
do
  DATA=$(aws dynamodb scan --table-name $TABLE --max-items $maxItems --starting-token $nextToken)
  ((index+=1))
  echo $DATA | jq ".Items | {\"$TABLE\": [{\"PutRequest\": { \"Item\": .[]}}]}" > inserts.jsons
  aws dynamodb batch-write-item --request-items file://inserts.jsons --endpoint-url http://localhost:8000
  nextToken=$(echo $DATA | jq '.NextToken')
done

Вот версия сценария, использующего файлы для хранения экспортированных данных на диске.

TABLE=YOURTABLE
maxItems=25
index=0
DATA=$(aws dynamodb scan --table-name $TABLE --max-items $maxItems)
((index+=1))
echo $DATA | cat > "$TABLE-$index.json"

nextToken=$(echo $DATA | jq '.NextToken')
while [[ "${nextToken}" != "" ]]
do
  DATA=$(aws dynamodb scan --table-name $TABLE --max-items $maxItems --starting-token $nextToken)
  ((index+=1))
  echo $DATA | cat > "$TABLE-$index.json"
  nextToken=$(echo $DATA | jq '.NextToken')
done

for x in `ls *$TABLE*.json`; do
  cat $x | jq ".Items | {\"$TABLE\": [{\"PutRequest\": { \"Item\": .[]}}]}" > inserts.jsons
  aws dynamodb batch-write-item --request-items file://inserts.jsons --endpoint-url http://localhost:8000
done
person Ivailo Bardarov    schedule 15.03.2019
comment
Вы можете создавать элементы по одному в AWS Console в этом формате, если вы выберете параметр «Текст» и установите флажок DynamoDB Json. - person Aposhian; 23.01.2020
comment
Предупреждение: если DynamoDB содержит экранированные символы (например, новую строку), это может не работать в некоторых оболочках. - person Woodz; 19.01.2021
comment
@Woodz Я тестировал на bash, в какой оболочке возникает ошибка? - person Ivailo Bardarov; 19.01.2021
comment
@IvailoBardarov, к сожалению, поведение bash (и встроенных инструментов bash, таких как echo - см. Заголовок stackoverflow.com/questions/8467424/) несовместим с ОС, например, в Intel MacOS 11.1 с записью DynamoDB, содержащей экранированный символ новой строки (\n) , этот сценарий заменяет экранированный символ новой строки фактическим символом новой строки в файле JSON, тем самым прерывая вызов jq с помощью: parse error: Invalid string: control characters from U+0000 through U+001F must be escaped at line 2, column 23. Я решил с sed двойным экранированием \n - person Woodz; 20.01.2021

Существует инструмент под названием DynamoDBtoCSV

который можно использовать для экспорта всех данных в файл CSV. Однако, если наоборот, вам придется создать свой собственный инструмент. Я предлагаю вам добавить эту функциональность в инструмент и внести ее в репозиторий Git.


Другой способ - использовать для этой задачи AWS Data Pipeline (вы сэкономите на чтении данных из внешней инфраструктуры AWS). Подход аналогичен:

  1. Создайте конвейер для вывода
  2. Загрузите файл.
  3. Разберите его с помощью специального ридера.
person Dani C.    schedule 20.09.2013
comment
Интересное решение, было бы интересно увидеть этот пользовательский считыватель, есть много шума из-за типов данных - person Vadorequest; 24.10.2018
comment
Вы также можете просмотреть этот шаблон, чтобы создать и активировать конвейер. usecases.totalcloud.io/use-cases/aws-dynamodb- to-s3-exporter usecases.totalcloud.io/use -cases / - person Veer Abheek Singh Manhas; 25.06.2019
comment
Я хотел предложить отредактировать этот пост с примером его запуска, но оно было отклонено модами, спасибо модам. В любом случае, вот способ запустить скрипт DynamoDbToCsv. sudo npm install -g dynamodbexportcsv; DynamoDbExportCsv --table "yourtable" --awsregion "us-east-1" --columns "col1,col2,col3" --scans 8 --gzip; cat *.gz > combined.csv.gz - person Colin D; 01.12.2020

Экспортируйте его из интерфейса DynamoDB в S3.

Затем преобразуйте его в Json с помощью sed:

sed -e 's/$/}/' -e $'s/\x02/,"/g' -e $'s/\x03/":/g' -e 's/^/{"/' <exported_table> > <exported_table>.json

Источник

person nostromo    schedule 16.05.2014
comment
Это спасло мне день! - person Colleen Mayer; 09.08.2017

Вот способ экспортировать некоторые данные (часто мы просто хотим получить образец наших данных о продукте локально) из таблицы, используя aws cli и jq. Предположим, у нас есть таблица продуктов, которая, как ни странно, называется my-prod-table, и локальная таблица с именем my-local-table.

Для экспорта данных выполните следующее:

aws dynamodb scan --table-name my-prod-table \
| jq '{"my-local-table": [.Items[] | {PutRequest: {Item: .}}]}' > data.json

В основном происходит то, что мы сканируем нашу таблицу prod, преобразуем вывод сканирования в форму в формат batchWriteItem и записать результат в файл.

Чтобы импортировать данные в локальную таблицу, выполните:

aws dynamodb batch-write-item \
--request-items file://data.json \
--endpoint-url http://localhost:8000

Примечание. Есть некоторые ограничения с запросом batch-write-item - операция BatchWriteItem может содержать до 25 отдельных запросов PutItem и DeleteItem и может записывать до 16 МБ данных. (Максимальный размер отдельного элемента - 400 КБ.).

person Valy Dia    schedule 26.03.2019
comment
как эта строка должна выглядеть в окнах? - person Žilvinas; 03.09.2020

Я расширяю решение Valy dia, чтобы разрешить весь процесс экспорта только с помощью aws-cli | jq

aws dynamodb scan --max-items 3 --table-name <TABLE_NAME> \
| jq '{"<TABLE_NAME>": [.Items[] | {PutRequest: {Item: .}}]}' > data.json

aws dynamodb describe-table --table-name <TABLE_NAME> > describe.json | jq ' .Table | {"TableName": .TableName, "KeySchema": .KeySchema, "AttributeDefinitions": .AttributeDefinitions,  "ProvisionedThroughput": {
      "ReadCapacityUnits": 5,
      "WriteCapacityUnits": 5
}}' > table-definition.json

aws dynamodb create-table --cli-input-json file://table-definition.json  --endpoint-url http://localhost:8000 --region us-east-1

aws dynamodb batch-write-item --request-items file://data.json --endpoint-url http://localhost:8000

aws dynamodb scan --table-name <TABLE_NAME> --endpoint-url http://localhost:8000
person JorgeTovar    schedule 29.05.2020
comment
Версия Windows aws Dynamodb describe-table --no-verify-ssl --table-name ‹TABLE› | jq .Table | {\ TableName \: .TableName, \ KeySchema \: .KeySchema, \ AttributeDefinitions \: .AttributeDefinitions, \ ProvisionedThroughput \: {\ ReadCapacityUnits \: 5, \ WriteCapacityUnits \: 5}, \ GlobalSecondaryIndexes \: {\ IndexName \: {\ IndexName IndexName, \ KeySchema \: .KeySchema, \ Projection \: .Projection, \ ProvisionedThroughput \: {\ ReadCapacityUnits \: 5, \ WriteCapacityUnits \: 5}}} - person Sólon Soares; 28.06.2021

Я думаю, что мой ответ больше похож на Ивайло Бардарова, если вы планируете запускать это из экземпляра Linux, запустите это

1. Войдите в свою учетную запись AWS и перейдите в IAM, чтобы создать пользователя с ограниченной политикой для роли (конечно, в целях безопасности). Это должно быть ограничено только чтением таблицы Dynamodb, которую вы хотите сделать резервную копию.

2. Скопируйте ключ доступа и секрет и обновите команду ниже, чтобы запустить ее в Linux (но убедитесь, что ваша таблица не огромна и, возможно, создает проблему с пространством для окна, на котором вы это запускаете)

AWS_ACCESS_KEY_ID='put_your_key' AWS_SECRET_ACCESS_KEY='put_your_secret' aws --region='put_your_region' dynamodb scan --table-name 'your_table_name'>> export_$(date "+%F-%T").json

Обратите внимание, что аналогичная команда может быть выполнена в Windows / Powershell, которую я не тестировал, поэтому я не добавляю ее здесь.

person grepit    schedule 06.04.2020
comment
Я тестировал в Windows, вот пример: aws Dynamodb scan --table-name = TableA ›export.json --region = us-east-1 - person influent; 07.05.2020
comment
Спасибо за подтверждение - person grepit; 07.05.2020

Попробуйте мой простой скрипт node.js динамо-архив. Он экспортирует и импортирует в формате JSON.

person yegor256    schedule 21.09.2013
comment
Он в значительной степени сломан - он может экспортировать, но не может импортировать, он просто вылетит - person Denis Mysenko; 29.08.2017
comment
@DenisMysenko, отправьте тикет, мы исправим - person yegor256; 29.08.2017

Я обнаружил, что лучший текущий инструмент для простого импорта / экспорта (включая циклическое переключение через DynamoDB Local) - это скрипт Python:

https://github.com/bchew/dynamodump

Этот скрипт поддерживает экспорт / импорт схемы, а также импорт / экспорт данных. Он также использует пакетные API-интерфейсы для эффективных операций.

Я успешно использовал его для переноса данных из таблицы DynamoDB в DynamoDB local для целей разработки, и он работал очень хорошо для моих нужд.

person Jimmy S    schedule 27.07.2015

Расширяя ответ @Ivailo Bardarov, я написал следующий сценарий, дублирующие таблицы, которые находятся в удаленном DynamoDB, на локальный один:

#!/bin/bash
declare -a arr=("table1" "table2" "table3" "table4")
for i in "${arr[@]}"
do
    TABLE=$i
    maxItems=25
    index=0
    echo "Getting table description of $TABLE from remote database..."
    aws dynamodb describe-table --table-name $TABLE > table-description.json
    echo
    echo "Creating table $TABLE in the local database..."
    ATTRIBUTE_DEFINITIONS=$(jq .Table.AttributeDefinitions table-description.json)
    KEY_SCHEMA=$(jq .Table.KeySchema table-description.json)
    BILLING_MODE=$(jq .Table.BillingModeSummary.BillingMode table-description.json)
    READ_CAPACITY_UNITS=$(jq .Table.ProvisionedThroughput.ReadCapacityUnits table-description.json)
    WRITE_CAPACITY_UNITS=$(jq .Table.ProvisionedThroughput.WriteCapacityUnits table-description.json)
    TABLE_DEFINITION=""

    if [[ "$READ_CAPACITY_UNITS" > 0 && "$WRITE_CAPACITY_UNITS" > 0 ]]
    then
    TABLE_DEFINITION="{\"AttributeDefinitions\":$ATTRIBUTE_DEFINITIONS,\"TableName\":\"$TABLE\",\"KeySchema\":$KEY_SCHEMA,\"ProvisionedThroughput\":{\"ReadCapacityUnits\":$READ_CAPACITY_UNITS,\"WriteCapacityUnits\":$WRITE_CAPACITY_UNITS}}"
    else
    TABLE_DEFINITION="{\"AttributeDefinitions\":$ATTRIBUTE_DEFINITIONS,\"TableName\":\"$TABLE\",\"KeySchema\":$KEY_SCHEMA,\"BillingMode\":$BILLING_MODE}"
    fi

    echo $TABLE_DEFINITION > create-table.json
    aws dynamodb create-table --cli-input-json file://create-table.json --endpoint-url http://localhost:8000
    echo "Querying table $TABLE from remote..."
    DATA=$(aws dynamodb scan --table-name $TABLE --max-items $maxItems)
    ((index+=1))
    echo "Saving remote table [$TABLE] contents to inserts.json file..."
    echo $DATA | jq ".Items | {\"$TABLE\": [{\"PutRequest\": { \"Item\": .[]}}]}" > inserts.json
    echo "Inserting rows to $TABLE in local database..."
    aws dynamodb batch-write-item --request-items file://inserts.json --endpoint-url http://localhost:8000

    nextToken=$(echo $DATA | jq '.NextToken')        
    while [[ "$nextToken" != "" && "$nextToken" != "null" ]]
    do
      echo "Querying table $TABLE from remote..."
      DATA=$(aws dynamodb scan --table-name $TABLE --max-items $maxItems --starting-token $nextToken)
      ((index+=1))
      echo "Saving remote table [$TABLE] contents to inserts.json file..."
      echo $DATA | jq ".Items | {\"$TABLE\": [{\"PutRequest\": { \"Item\": .[]}}]}" > inserts.json
      echo "Inserting rows to $TABLE in local database..."
      aws dynamodb batch-write-item --request-items file://inserts.json --endpoint-url http://localhost:8000
      nextToken=$(echo "$DATA" | jq '.NextToken')
    done
done

echo "Deleting temporary files..."
rm -f table-description.json
rm -f create-table.json
rm -f inserts.json

echo "Database sync complete!"

Этот сценарий просматривает массив строк и для каждого имени таблицы сначала получает описание таблицы, создает файл JSON с минимально необходимыми параметрами и создает таблицу. Затем он использует остальную часть логики @Ivailo Bardarov для создания вставок и помещает их в созданную таблицу. Наконец, он очищает сгенерированные файлы JSON.

Имейте в виду, моей целью было просто создать грубую копию (следовательно, минимальные необходимые параметры) таблиц для целей разработки.

person Murat Aykanat    schedule 20.04.2020

Для тех из вас, кто предпочитает делать это с помощью java, существует DynamodbToCSV4j.

JSONObject config = new JSONObject();
config.put("accessKeyId","REPLACE");
config.put("secretAccessKey","REPLACE");
config.put("region","eu-west-1");
config.put("tableName","testtable");
d2csv d = new d2csv(config);
person quodlibet    schedule 06.01.2016
comment
Работал как шарм. Однако в этой библиотеке должна быть реализована разбивка на страницы по последнему вычисленному ключу. - person ZZzzZZzz; 08.09.2017

Я создал служебный класс, чтобы помочь разработчикам с экспортом. Это можно использовать, если вы не хотите использовать функцию конвейера данных AWS. Ссылка на репозиторий Git Hub находится здесь

person SarveshKaushal    schedule 04.11.2016

DynamoDB теперь имеет встроенную функцию экспорта в S3 (в форматах JSON и Amazon Ion) https://aws.amazon.com/blogs/aws/new-export-amazon-dynamodb-table-data-to-data-lake-amazon-s3/

person shiladitya    schedule 20.11.2020

Вы можете попробовать этот код локально. Но сначала нужно выполнить следующую команду npm init -y && npm install aws-sdk

const AWS = require('aws-sdk');
AWS.config.update({region:'eu-central-1'}); 
const fs = require('fs');
const TABLE_NAME = "YOURTABLENAME"

const docClient = new AWS.DynamoDB.DocumentClient({
    "sslEnabled": false,
    "paramValidation": false,
    "convertResponseTypes": false,
    "convertEmptyValues": true
});

async function exportDB(){
    let params = {
        TableName: TABLE_NAME
    };
    let result = [];
    let items;
    do  {
        items =  await docClient.scan(params).promise();
        items.Items.forEach((item) => result.push(item));
        params.ExclusiveStartKey  = items.LastEvaluatedKey;
    }   while(typeof items.LastEvaluatedKey != "undefined");

    await fs.writeFileSync("exported_data.json", JSON.stringify(result,null, 4)); 
    console.info("Available count size:", result.length);
}
exportDB();

И запустите node index.js

Я надеюсь это сработает для тебя

person Penava    schedule 08.01.2021


при необходимости вы можете преобразовать данные Dynamo в JSON с помощью этого https://2json.net/dynamo

person Beka    schedule 08.05.2017

В аналогичном сценарии использования я использовал DynamoDB Streams для запуска AWS Lambda, который в основном писал в мой экземпляр DW. Вероятно, вы могли бы написать свою Lambda, чтобы записывать каждое из изменений таблицы в таблицу в вашей непроизводственной учетной записи. Таким образом, ваш стол Devo также останется довольно близко к Prod.

person Alok Upadhyay    schedule 04.08.2017

Я использовал замечательный сайт cyberchef ... https://gchq.github.io/CyberChef

С помощью инструмента csv to json.

person mlo55    schedule 27.02.2020

Для действительно больших наборов данных выполнение непрерывного (и параллельного) сканирования может быть трудоемким и хрупким процессом (представьте, что он умирает в середине). К счастью, AWS недавно добавила возможность экспортировать данные таблицы DynamoDB прямо в S3. Это, вероятно, самый простой способ добиться того, чего вы хотели, потому что он не требует написания кода и запуска какой-либо задачи / скрипта, потому что он полностью управляем.

После этого вы можете загрузить его с S3 и импортировать в локальный экземпляр DynamoDB, используя такую ​​логику, как foreach record in file: documentClient.putItem, или использовать другую инструменты.

person Rafal Wiliński    schedule 11.04.2021

В веб-консоли DynamoDB выберите свою таблицу, затем Действия -> Экспорт / Импорт.

person Nulldevice    schedule 25.05.2016
comment
При этом будут экспортированы только выбранные вами записи. - person ingh.am; 10.01.2017
comment
Этот метод также ограничивает вас экспортом максимум 100 записей. Это нормально для небольших наборов данных, но для больших наборов данных рекомендуется использовать конвейер для экспорта в S3. - person Jim Daehn; 03.07.2017
comment
Этот метод имеет серьезные ограничения. - person Arry; 20.02.2019
comment
плохой метод, он действительно не экспортирует все записи - только выбранный, который равен максимуму записей на одной странице. - person Vladyslav Didenko; 29.09.2019