DynamoDBのデータをエクスポートしてCSVに変換
エクスポートはData Pipelineを利用してS3の指定したバケットに。
データは行ごとにJSONで出力されるのでこれをテキトーにRubyでCSVに変換する。
DynamoDBのエクスポート
基本的にはドキュメント通りにやればあっけなく終わる。
エクスポートの際の疑問点や若干ハマったこと
AWS Data PipelineのIAMロール作成の際の疑問点
日本語ドキュメントを読んでいたら以下のように書いてあった。
以前に AWS Data Pipeline コンソールを使用してパイプラインを作成した場合、DataPipelineDefaultRole と DataPipelineDefaultResourceRole はその時点で自動的に作成されています。これ以上の操作は必要ありません。
自動的に作成されるならそもそも手動で作る必要ないのでは?と思いしばし手が止まった。
英文の方を見てみると「前に作ったものを再利用できます」的なニュアンスだったので翻訳の表現がちょっと良くないようだ。
そんなわけでドキュメントの指示通りに手動でサクッと作った。
リージョン間違い
テーブルがないと言うエラーが出るのでなんで?と思ったらリージョン間違ってました。リージョンは正しく指定しよう。
参考: AWS DataPipeline says DynamoDB Table not found
DynamoDB read throughput ratioとは?
よく分からないがデフォルトが0.25で最大1となっている。
なんとなく0.5にしてみたがどれだけ影響があったのかどうか分からない。
5万件くらいのデータを約10分でエクスポート完了していたので毎分1万件、毎秒166件か。
Readキャパシティ5だからだいぶ超過している気がするがこのあたりどうなっているのか。
まあとりあえずデータ件数がよほど膨大でない限りはあまり気にする必要っぽいか。
2019-05-08追記
後日同じデータを同じ設定でエクスポートしたら25分かかった。ちょっと謎。
早く終えたい場合EMRのスペックを盛ればいいのかな?
どこでどれだけ時間がかかっているのかいまいち分からない。
CSVへの変換
エクスポートされたデータをS3から落としてきてRubyでCSVに変換。ファイル名はdynamodb.dataにリネームしてから。
require "json"
require "csv"
File.open("dynamodb.data") do |f|
CSV.open("dynamodb.csv", "w", :force_quotes => true) do |csv|
csv << ["id", "name", "email", "created_at"]
f.each_line do |l|
user = JSON.parse(l)
# USTからJSTへの変換
date_ust = DateTime.parse(user["created_at"]["s"])
date_jst = Time.at(date_ust.to_time.to_i).to_datetime
csv << [
user["id"]["s"],
user["name"]["s"],
user["email"]["s"],
date_jst.to_s,
]
end
end
end