LoginSignup
9
9

More than 5 years have passed since last update.

MongoDBのデータをS3経由でRedShiftに入れる

Last updated at Posted at 2014-03-05

追記: 時代は変わった

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クエリの最後のCSVCSV GZIPにして読み込ませることもできます。データの量が大きいときはGZIPを使うとよさそうです。

9
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
9