在DynamoDB中将一个表复制到另一个表

ens*_*are 18 amazon-web-services amazon-dynamodb

在DynamoDB中将一个表格相同地复制到新表格的最佳方法是什么?

(我不担心原子性).

Roh*_*mer 31

我只是使用了 python 脚本dynamodb-copy-table,确保我的凭据在一些环境变量(AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY)中,并且它完美地工作。它甚至为我创建了目标表。

python dynamodb-copy-table.py src_table dst_table

默认区域是us-west-2,使用AWS_DEFAULT_REGIONenv 变量更改它。

  • 太棒了,就像魅力一样,而且使用起来非常简单!可惜这个答案只有 0 票,所以我几乎忽略了它。+1 (3认同)
  • 如果目标表已存在,则设置 DISABLE_CREATION=true (2认同)

Ala*_*ack 16

AWS Pipeline提供了一个可用于此目的的模板:"CrossRegion DynamoDB Copy"

请参阅:http://docs.aws.amazon.com/datapipeline/latest/DeveloperGuide/dp-crossregion-ddb-create.html

结果是一个简单的管道,看起来像:

在此输入图像描述

虽然它被称为CrossRegion,但只要目标表名称不同,您就可以轻松地将它用于同一区域(请记住,每个帐户和区域的表名都是唯一的)

  • 不幸的是,该模板似乎已从数据管道控制台中消失了。 (3认同)

Jun*_*awa 12

我喜欢为此使用一个简单的 bash 脚本的想法,因此我决定采用 @bogdan-kiselitsa 的出色答案并将其扩展到大于 25 个项目的表。

# exit on error
set -eo pipefail

# tables
TABLE_FROM=$1
TABLE_TO=$2

# read
aws dynamodb scan \
  --table-name "$TABLE_FROM" \
  --output json \
 | jq "[ .Items[] | { PutRequest: { Item: . } } ]" \
 > "$TABLE_FROM-dump.json"

table_size="$(cat "${TABLE_FROM}-dump.json" | jq '. | length')"
echo "table size: ${table_size}"

# write in batches of 25
for i in $(seq 0 25 $table_size); do
  j=$(( i + 25 ))
  cat "${TABLE_FROM}-dump.json" | jq -c '{ "'$TABLE_TO'": .['$i':'$j'] }' > "${TABLE_TO}-batch-payload.json"
  echo "Loading records $i through $j (up to $table_size) into ${TABLE_TO}"
  aws dynamodb batch-write-item --request-items file://"${TABLE_TO}-batch-payload.json"
  rm "${TABLE_TO}-batch-payload.json"
done


# clean up
rm "${TABLE_FROM}-dump.json"
Run Code Online (Sandbox Code Playgroud)

如果将其保存到migrate.sh那么您可以运行:

$ ./migrate.sh table_v1 table_v2
Run Code Online (Sandbox Code Playgroud)

  • 工作完美。这次真是万分感谢 (3认同)

Sai*_*tty 9

创建一个备份(backups选项)并使用新的表名还原该表。这样会将所有数据放入新表中。注意:需要花费大量时间,具体取决于表的大小

  • 如果用例像我的一样,并且您只需要创建一个重复的表进行测试而不关心原子性或者如果两个表中的内容都更新,那么它非常有用。 (3认同)

Bog*_*tsa 8

以下是一种仅使用 shell 脚本、AWS CLIjq将所有项目从一个表复制到另一个表的解决方案。对于小桌子来说可以使用。

# exit on error
set -eo pipefail

# tables
TABLE_FROM=<table>
TABLE_TO=<table>

# read
aws dynamodb scan \
  --table-name "$TABLE_FROM" \
  --output json \
 | jq "{ \"$TABLE_TO\": [ .Items[] | { PutRequest: { Item: . } } ] }" \
 > "$TABLE_TO-payload.json"

# write
aws dynamodb batch-write-item --request-items file://"$TABLE_TO-payload.json"

# clean up
rm "$TABLE_TO-payload.json"
Run Code Online (Sandbox Code Playgroud)

如果两个表相同,则需要先删除 TABLE_TO 中的所有项目。

  • 由于批量写入项目不允许导入超过 25 个项目,因此仅限 25 个项目 (5认同)

Che*_*rel 7

您可以使用" 扫描"读取数据并将其保存到新表中.

在AWS论坛上,来自AWS团队的人员使用EMR发布了另一种方法:如何复制表?

  • 我只想复制`Schema`.我怎么做? (5认同)
  • 链接不再可用。 (2认同)

Sau*_*ava 5

DynamoDB 现在支持从 S3 导入。

https://aws.amazon.com/blogs/database/amazon-dynamodb-can-now-import-amazon-s3-data-into-a-new-table/

因此,可能在几乎所有用例中,复制表的最简单且最便宜的方法是

  1. 使用“导出到 S3”功能将整个表转储到 S3。由于这使用备份来生成转储,因此表的吞吐量不受影响,并且速度也非常快。您需要启用备份 (PITR)。请参阅https://aws.amazon.com/blogs/aws/new-export-amazon-dynamodb-table-data-to-data-lake-amazon-s3/

  2. 使用“从 S3 导入”导入步骤 1 中创建的转储。这会自动要求您创建一个新表。