从DynamoDB导出数据

时间:2013-09-19 13:42:25

标签: amazon-web-services amazon-dynamodb amazon-dynamodb-local

是否可以以某种格式从DynamoDB表导出数据?

具体的用例是我想从我的生产dynamodb数据库导出数据并将该数据导入我的本地dynamodb实例,这样我的应用程序就可以使用本地数据副本而不是生产数据。

我使用link作为DynamoDB的本地实例。

18 个答案:

答案 0 :(得分:16)

有一个名为DynamoDBtoCSV

的工具

可用于将所有数据导出到CSV文件。但是,相反,你必须建立自己的工具。我的建议是,您将此功能添加到该工具,并将其贡献给Git存储库。


另一种方法是使用AWS Data Pipeline执行此任务(您将节省从AWS基础架构外部读取数据的所有成本)。方法类似:

  1. 构建输出管道
  2. 下载文件。
  3. 使用自定义阅读器解析它。

答案 1 :(得分:8)

将其从DynamoDB界面导出到S3。

然后使用sed将其转换为Json:

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

Source

答案 2 :(得分:4)

这会将所有项目导出为jsons文档

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

答案 3 :(得分:3)

我认为我的答案与Ivailo Bardarov更加相似,如果计划从linux实例运行它,请运行

1。登录到您的AWS账户并转到IAM以为角色创建策略受限的用户(当然出于安全目的)。这仅应限于读取要备份的dynamodb表。

2。复制访问密钥和密钥,并更新以下命令以在Linux上运行它(但请确保您的表不是很大,并且可能在运行该文件的盒子上造成空间问题)

it ("your definition") {
   eventually { Thread.sleep(50); step1() should be A // assertion }
   eventually { Thread.sleep(50); step2() should be B }
   eventually { Thread.sleep(50); step3() should be C }
}

请注意,类似的命令可以在未经测试的Windows / Powershell上执行,因此不在此处添加。

答案 4 :(得分:2)

尝试我的简单node.js脚本dynamo-archive。它以JSON格式导出和导入。

答案 5 :(得分:2)

我扩展了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

答案 6 :(得分:2)

扩展@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文件。

请记住,我的目的只是为开发目的而创建表的粗略副本(因此需要最少的参数)。

答案 7 :(得分:1)

我创建了一个实用程序类来帮助开发人员进行导出。如果您不想使用AWS的数据管道功能,则可以使用此功能。链接到git hub repo的是 - here

答案 8 :(得分:1)

这是一种使用aws clijq从表中导出一些数据(通常我们只想在本地获取产品数据样本)的方法。 假设我们有一个名为my-prod-table的prod表和一个名为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 MB的数据。 (单个项目的最大大小为400 KB。)

答案 9 :(得分:1)

对于那些宁愿使用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);

答案 10 :(得分:1)

我发现用于简单导入/导出的最新工具(包括通过DynamoDB Local进行往返)是这个Python脚本:

https://github.com/bchew/dynamodump

此脚本支持架构导出/导入以及数据导入/导出。它还使用批处理API进行高效操作。

我已成功使用它将DynamoDB表中的数据传输到DynamoDB本地用于开发目的,并且它可以很好地满足我的需求。

答案 11 :(得分:0)

我使用了很棒的Cyber​​chef网站... https://gchq.github.io/CyberChef

使用csv to json工具。

答案 12 :(得分:0)

DynamoDB现在具有本地导出到S3功能(JSON和Amazon Ion格式)https://aws.amazon.com/blogs/aws/new-export-amazon-dynamodb-table-data-to-data-lake-amazon-s3/

答案 13 :(得分:0)

您可以在本地尝试此代码。但首先应执行以下命令 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

希望对你有用

答案 14 :(得分:0)

对于非常大的数据集,运行连续(和并行)扫描可能是耗时且脆弱的过程(想象一下它在中间死亡)。幸运的是,AWS 最近添加了 export your DynamoDB table data straight to S3 的功能。这可能是实现您想要的最简单方法,因为它不需要您编写任何代码和运行任何任务/脚本,因为它是完全托管的。

完成后,您可以从 S3 下载它并使用 foreach record in file: documentClient.putItem 等逻辑或使用其他一些 tooling 导入到本地 DynamoDB 实例。

答案 15 :(得分:-1)

在类似的用例中,我使用DynamoDB Streams来触发基本写入DW实例的AWS Lambda。您可以编写Lambda来将每个表更改写入非生产帐户中的表。这样你的Devo表也会与Prod保持非常接近。

答案 16 :(得分:-1)

Dynamo DB现在提供了一种从S3导出数据或从S3导入数据的方法 http://aws.amazon.com/about-aws/whats-new/2014/03/06/announcing-dynamodb-cross-region-export-import/

答案 17 :(得分:-2)

在DynamoDB Web控制台中选择您的表,而不是操作 - &gt;导出/导入