0
votes

Chargement des données de AWS Redshift à l'aide de Python

Je suis confronté à une mission impossible d'extraire une énorme quantité de données d'Amazone Redshift à une autre table. Cela nécessite définitivement une approche plus efficace, mais je suis nouveau à SQL et AWS a donc décidé de demander conseil à cette communauté intelligente.

Ceci est ma requête initiale SQL qui prend pour toujours: P>

from sqlalchemy import create_engine
import os
import pandas as pd

redshift_user = os.environ['REDSHIFT_USER']
redshift_password = os.environ['REDSHIFT_PASSWORD']

engine_string = "postgresql+psycopg2://%s:%s@%s:%d/%s" \
% (redshift_user, redshift_password, 'localhost', XXXX, 'redshiftdb')
engine = create_engine(engine_string)

for df in pd.read_sql_query("""
                        SELECT DISTINCT at_id, utc_time, name
                        INSERT INTO my_new_table
                        FROM s3_db.table_x
                        WHERE type = 'create' 
                        AND (dt BETWEEN '20181001' AND '20181031');
                       """, engine, chunksize=1000000):


7 commentaires

Vous déplacez des données d'une table redshift à une autre table Redshift?


Oui c'est correct.


Le fonctionnement de la base de données sera finalement plus rapide que d'aller aux pandas, puis de retour à Redshift, le problème est qu'il faut à LIP maintenant?


Exactement - presque impossible à compléter au fur et à mesure que je reçois un temps de tuyau brisé pour tout le temps. Y a-t-il une façon de le faire dans des morceaux dans SQL?


Vous devez prendre un regard plus détaillé sur la structure de la table source. Est-ce une table de Redshift réelle, ou comme le nom "S3_DB" semble impliquer, est-ce une table de spectre? Si ces derniers, les données peuvent exister en tant que fichiers de S3 plutôt que redshift lui-même et vous pouvez potentiellement utiliser d'autres outils tels que EMR / Spark, Athena ou Colle pour créer le nouveau jeu de données. S'il s'agit d'une table redshift réelle, vérifiez la clé de distribution et la touche de tri pour la table source. Si vous pouvez appliquer un filtre à la touche de tri, cela peut aider à accélérer la requête.


S'il vous plaît pouvez-vous clarifier - essayez-vous de copier de S3? (c.-à-d. est S3_DB un schéma de spectre?) Si tel est le cas, essayez d'abord de remplacer votre approche avec une commande de copie redshift pour copier dans RedShift suivi de votre logique de transformation (sélectionnez Distinct) en tant que CTAS, car John décrit dans sa réponse.


Oui, vous avez raison - S3_DB est une table de spectre.


3 Réponses :


2
votes

Vous devriez utiliser Créer une table comme .

Ceci vous permet de spécifier une instruction SELECT et avez les résultats directement stockés dans une nouvelle table.

Ceci est extrêmement efficace plus efficace que le téléchargement de données et la nouvelle téléchargement.

Vous pouvez également créer une table comme , puis le charger avec des données. Voir: Effectuer une copie profonde

Vous pouvez également Décharger DATA sur Amazon S3, puis le charger à nouveau via Copier , mais à l'aide de Créer une table comme est définitivement la meilleure option .


1 commentaires

John, c'est une bonne logique générale, mais dans ce cas, je l'optique essaie de copier de S3 à Redshift (nous avons besoin de clarification)



0
votes

Il apparaît maintenant que vos données source sont stockées dans Amazon S3 et vous utilisez une table de spectre redshift (qui pointe vers des données dans S3) comme source.

La méthode préférée serait:

  • Utilisez la commande Amazon Redshift Copier pour charger les données dans une table Redshift
  • Utilisez un Créer une table sous forme pour extraire (ETL) les données de la nouvelle table Redshift dans votre table souhaitée. Si vous faites cela régulièrement, vous pouvez utiliser tronquer et dans pour recharger le tableau à l'avenir.

0 commentaires

1
votes

Veuillez vous reporter aux directives AWS pour les meilleures pratiques de Redshift et Spectrum; J'ai mis les liens à la fin de ce post. Sur la base de votre question, je suppose que vous voulez que vous souhaitiez extraire, transformer et charger une quantité énorme de données de la table basée sur Spectrum redshift "S3_DB.table_X" à la nouvelle table Redshift "My_New_Table"

Voici quelques suggestions basées sur des recommandations AWS:

  1. Créez votre table redshift avec la touche de distribution appropriée, la touche de tri et le codage de la compression. À haut niveau, "AT_ID" semble le mieux adapté comme clé de partition et "utc_time" comme sortkey pour votre exigence, mais assurez-vous de référer des directives AWS pour la conception de table redshift 3 .

  2. Comme vous l'avez mentionné, votre volume de données est énorme, vous pouvez avoir votre table source S3 "S3_DB.TABLE_X" partitionné en fonction des colonnes "Type" et "DT" (comme suggéré au point numéro 4 dans Spectrum Meilleures pratiques 1 ).

  3. remplacer distinct avec Groupe par dans la requête SELECT de SPECTRUM (numéro de point 9 dans les meilleures pratiques de spectre 1 ).

  4. AWS recommande (Numéro de point 7 dans les meilleures pratiques de spectre 1 ) Pour simplifier votre processus ETL à l'aide de Créer une table comme sélectionnez ou Sélectionnez dans Déclarations, dans laquelle vous pouvez mettre votre transformation. Logique dans le composant Sélectionner pour charger des données directement S3 à Redshift.

    Redshift Spectrum Meilleures pratiques

    Redshift Meilleures pratiques

    Redshift Table Design Playbook


0 commentaires