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):
3 Réponses :
Vous devriez utiliser Créer une table comme . p>
Ceci vous permet de spécifier une instruction code> SELECT CODE> et avez les résultats directement stockés dans une nouvelle table. P>
Ceci est extrêmement efficace em> plus efficace que le téléchargement de données et la nouvelle téléchargement. p>
Vous pouvez également Vous pouvez également créer une table comme code>, puis le charger avec des données. Voir: Effectuer une copie profonde p>
Décharger CODE> DATA sur Amazon S3, puis le charger à nouveau via
Copier code>, mais à l'aide de
Créer une table comme code> est définitivement la meilleure option . p>
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)
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. P>
La méthode préférée serait: p>
Copier CODE> pour charger les données dans une table Redshift Li>
- Utilisez un
Créer une table sous forme code> 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 code> et dans code> pour recharger le tableau à l'avenir. LI>
ul>
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" P>
Voici quelques suggestions basées sur des recommandations AWS: P>
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 . P> P> L>
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 ). P> li>
remplacer AWS recommande (Numéro de point 7 dans les meilleures pratiques de spectre 1 ) Pour simplifier votre processus ETL à l'aide de Redshift Spectrum Meilleures pratiques
Redshift Meilleures pratiques a>
Redshift Table Design Playbook p> distinct code> avec
Groupe par code> dans la requête SELECT de SPECTRUM (numéro de point 9 dans les meilleures pratiques de spectre 1 ). P> LI>
Créer une table comme sélectionnez code> ou
Sélectionnez dans CODE> Déclarations, dans laquelle vous pouvez mettre votre transformation. Logique dans le composant Sélectionner pour charger des données directement S3 à Redshift. p> li>
ol>
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.