Copier des données de Postgres DB à AWS S3 en une seule étape

Nav_cfc:

J'ai un cas d'utilisation pour transférer des données sélectionnées de Postgres à Amazon S3. Cela devrait se faire en une seule étape. Je suis en train d'écrire un programme Java pour réaliser ce but.

Je l'ai trouvé un moyen de copier les données en 2 étapes. J'utilise la bibliothèque CopyManager et la méthode copyout pour obtenir les données dans mon local. Après cela, je me déplace le même fichier dans S3 en utilisant Java.

postgres code pour obtenir les données dans ma section locale

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);

Code AWS pour passer du local au S3

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

Je pense que cela se produise dans un aller au lieu d'écrire dans un fichier et déplacer le fichier à S3.

Adam Bethke:

Si vous êtes ouvert à le faire en python, voici un exemple qui devrait fonctionner:

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)

Ce processus utilise le tempfilemodule python, ce qui vous permet de créer un fichier qui obtient est utilisé et ensuite retiré dans le processus. Le gestionnaire de contexte ( with tempfile...) simplifie la gestion du processus d'écriture de fichiers, de sorte que vous ne devez pas le supprimer manuellement. Selon la façon dont vous configurez le tempfile, vous pouvez rendre le fichier accessible à, ou jamais visible, les utilisateurs du système. En gros, vous diffusez l'instruction SELECT STDOUT, puis écrire STDOUT à un tempfile. Vous êtes toujours redevable à votre base de données pour l'instruction SELECT en termes de gestion de la mémoire, la vitesse et l' accès.

L'avantage est que vous n'avez pas besoin de garder en mémoire le fichier entier tout en essayant de le transférer à S3; les inconvénients sont que vous avez besoin de suffisamment d'espace disque pour stocker temporairement le fichier, et qu'il est évidemment plus lent parce que vous écrivez sur le disque plutôt que de faire la chose entière en mémoire.

L'autre chose à noter est que je continuais à l'étape où python compresse le fichier en utilisant gzip avant de le télécharger. Je l'ai fait pour économiser de l'espace sur le téléchargement; ce qui est particulièrement utile si vous téléchargez une table avec beaucoup de données répétitives.

En aparté: vous devriez ne pas l' utiliser comme-est dans un environnement où vous êtes ouvert à l' injection SQL; il y a de meilleures façons de générer la commande COPY si c'est une partie de votre cas d' utilisation.

Je suppose que tu aimes

Origine http://43.154.161.224:23101/article/api/json?id=219984&siteId=1
conseillé
Classement