ワンステップでAWS S3にPostgresのDBからデータをコピーします

Nav_cfc:

私は、Amazon S3へのPostgresから選択されたデータを移動するためのユースケースを持っています。これは、単一のステップで起こるはず。私はこれを成し遂げるために、Javaプログラムを書いています。

私は2つの段階でデータをコピーする方法を考え出しました。私は私のローカルにデータを取得するためにCopyManagerライブラリとcopyOutメソッドを使用します。この後、私はJavaを使用してS3に同じファイルを移動しています。

postgresのコードは私のローカルにデータを取得します

CopyManager copyManager = new CopyManager((BaseConnection) con);
FileWriter fileWriter = new FileWriter("file.csv");
copyManager.copyOut("COPY (SELECT stmt) TO STDOUT WITH DELIMITER '\t' CSV HEADER", fileWriter);

S3にローカルから移動するAWSコード

AmazonS3 conn = new AmazonS3Client(credentials);
conn.setEndpoint("xxx.com");
conn.putObject(
            bucket1.getName(),
            "request.json",
            new File("file.csv")
    );

私はそれがファイルへの書き込み、その後、S3にファイルを移動するのではなく、行く1で起こることを期待します。

アダムBethke:

あなたはpythonでそれをやってに開放している場合は、ここでは動作するはずの例です:

import boto
import gzip
import psycopg2
import tempfile

# database connection setup
connection = psycopg2.connect('postgresql://scott:tiger@localhost/mydatabase')
connection.autocommit = True
cursor = connection.cursor()

# aws connection setup
s3_connection = boto.connect_s3('<aws access key>', '<aws secret key>')
bucket = s3_connection.get_bucket('<bucket>')

with tempfile.NamedTemporaryFile() as t:
    with gzip.GzipFile(t.name, mode='wb') as g:
        cursor.copy_expert("COPY ({0}) TO STDOUT WITH CSV HEADER".format('<select_query>'), g)
    key = boto.s3.key.Key(bucket, '<s3_key>')
    key.set_contents_from_filename(g.name)

このプロセスは、使用可能tempfileあなたが使用して、プロセス内で削除されますファイルを作成することができますPythonでモジュールを。コンテキストマネージャは、(with tempfile...あなたがそれを手動で削除する必要はありませんので)、ファイル書き込み処理の管理を簡素化します。あなたは一時ファイルの設定方法に応じて、あなたは、システムのユーザーにファイルがアクセス可能に、または決して見えるようにすることができます。基本的に、あなたはSTDOUTにSELECT文をストリーミングしている、その後、一時ファイルにSTDOUTを書き込むこと。あなたはまだ、メモリ管理、スピード、アクセスの面でSELECT文のデータベースに恩義ています。

利点は、あなたがS3に転送しようとしているとき、メモリにファイル全体を維持する必要がないということです。欠点は、あなたが一時的にファイルを格納するのに十分なディスク容量を必要とすることであり、それは明らかに遅くなるということなぜならあなたメモリに全体のことをやってとは対照的に、ディスクへの書き込みです。

ノートへの他の事は、私はPythonがアップロードする前にgzipを使用してファイルを圧縮されたステップに保管ということです。私は、アップロード時にスペースを節約するためにそれをしました。あなたが繰り返し大量のデータを持つテーブルをアップロードする場合に特に便利です。

余談として:あなたがすべきではないとして、あるSQLインジェクションにあなたがしているオープンな環境でこれを使用します。それはあなたのユースケースの一部だ場合はCOPYコマンドを生成するのより良い方法があります。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=219983&siteId=1