こんにちは。
Amazon DynamoDB上のテーブルからcsvをExport、またはImportする方法について調べたのでいくつか方法をまとめました。
Export
コンソールの利用
DynamoDBの管理画面からCSVをダウンロードすることができる。仕様として画面に表示されている項目しか出力できない(最大100件)
AWS CLI等の利用
AWS CLI(AWS SDK)でテーブルをスキャンしcsv形式で出力するコードを自作する。
aws dynamodb scan --table-name test | jq -r '.Items[] | [.id.N, .name.S, .flg.BOOL] | @csv' >> test.csv
Amazon AthenaのFederated Queryの利用
Amazon AthenaではFederated Queryを利用することでS3以外のデータソースに対してクエリをかけることができる。また、Athenaのクエリ結果はS3にcsv形式で保存される。これを利用してDynamoDBに対してクエリを発行することでcsvをExportできる。
awslabs/dyneinの利用
Importの章で後述
AWS DataPipelineの利用
出来るが使いどころは限られる印象。
Import
S3からの一括インポート
S3上のcsvを一括インポートする機能を利用する。Partition KeyとSort Keyはインポート時に指定した型で、それ以外はString型で取り込まれる。なお、既存のテーブルへはImport不可という制限がある。
AWS CLI等の利用
自作はできるが手間がかかる。例えばAWS CLIのbatch-write-itemを利用する場合、引数としてcsvをそのまま渡せないのでDynamoDB JSON形式に変換する必要がある。さらに一度に最大25件までのデータまでしか投入できない。それ以上のデータを投入したい場合はファイルを分割する必要がある。
put-itemを利用する場合、1件1件書き込む都合上Itemの件数が多い場合batch-write-item
と比較して時間がかかる。
「Amazon DynamoDB への CSV 一括取り込みの実装」の利用
AWSで紹介されているソリューション「Amazon DynamoDB への CSV 一括取り込みの実装」を利用する。CloudFormationを実行後、パラメーターで指定したS3のパスにcsvを配置すると、指定のテーブルにデータをImportしてくれる。こちらは既存のテーブルへImport可能。
awslabs/dyneinの利用
awslabsから提供されているdyneinというRustで記述されたCLIツールを利用する。以下のような感じでImportできる。ExportもImportと同じような感じでできる。
# Import
$ dy import --table test --format csv --input-file test.csv
# Export
$ dy export --table test --output-file out.csv --format csv
AWS DataPipelineの使用
出来るが使いどころは限られる印象。
おわり
お読みいただきありがとうございました!(re:Inventで既存テーブルにcsvをImportする機能来ないかな。)