追記: 時代は変わった
JSONオプションがRedShiftのCOPYコマンドに追加されたのでmongoexportのデータや, fluent-s3-pluginが生成するようなJSON linesファイルを直接ロードすることが可能になりました。
MongoDBからCSVで出力
MongoDB付属のmongoexportを使うとcsvファイルが作れます。以下のようなコマンドになるかと思います。-o
オプションを外せばとりあえず標準出力に出てきますので、試してみるのにいいかもしれません。(データ量が多いコレクションでやると大変かもですが)
mongoexportのデフォルトの挙動はJSON形式でのシリアライズなのでここでは--csv
オプションを忘れないように気をつけます。
$ mongoexport \
> --host mongo.example.com \
> --db mydb \
> --collection mycollection
> --fields name,mail,lang,blog_url \
> --csv \
> -o ./user.csv
以下のように、-q
オプションでクエリを与えることで出力するドキュメントを絞り込むこともできます。
$ mongoexport \
> --host mongo.example.com \
> --database mydb \
> --collection mycollection
> --fields name,mail,lang,blog_url \
> --csv \
> -q '{lang: "en"}' \
> -o ./user.csv
CSVをS3にアップロード
user.csvを RedShiftと同じリージョン にあるS3バケットにアップロードします。s3://example-bucket/import/user.csv
にアップロードされたものと仮定します。
アップロードにはs3cmdなどのコマンドラインツールS3Foxなどのブラウザプラグインや、MacならCyberduck, 3Hubなど、WindowsならS3 Browser, DragonDiskなどのGUIソフトなどが使えるでしょう。
RedShift上でCSVをS3からインポート
Redshiftにログイン。
$ psql -h (RedShiftのhost) -p 5439 -U username dbname
まだテーブルがなければ、CREATE TABLEで作っておきましょう。(ここでは適当な定義ですが、RedShiftワールドではdistkey,sortkeyおよび各カラムの圧縮形式が非常に重要ですので注意です)
> CREATE TABLE my_user_table(
> name varchar(255),
> mail varchar(255),
> lang varchar(255),
> blog_url varchar(1024)
> );
S3からRedShiftへのデータのロードにはCOPYクエリを使います。COPYクエリではAWSのキーが必要ですので、用意しておきます。
> COPY
> my_user_table
> FROM
> 's3://example-bucket/import/user.csv'
> CREDENTIALS
> 'aws_access_key_id=********************;aws_secret_access_key=****************************************'
> CSV;
ちなみにgzipしてuser.csv.gzとしてアップロードした場合、COPYクエリの最後のCSV
をCSV GZIP
にして読み込ませることもできます。データの量が大きいときはGZIPを使うとよさそうです。