web-dev-qa-db-fra.com

Comment charger des données dans Amazon Redshift via Python Boto3?

Dans Amazon Redshift Guide de démarrage , les données sont extraites d'Amazon S3 et chargées dans un cluster Amazon Redshift à l'aide de SQLWorkbench/J. Je voudrais imiter le même processus de connexion au cluster et de chargement d'échantillons de données dans le cluster en utilisant Boto .

Cependant dans documentation de Boto de Redshift, je ne trouve pas de méthode qui me permettrait de télécharger des données dans le cluster Amazon Redshift.

J'ai pu me connecter avec Redshift en utilisant Boto3 avec le code suivant:

client = boto3.client('redshift')

Mais je ne sais pas quelle méthode me permettrait de créer des tables ou de télécharger des données sur Amazon Redshift comme dans le tutoriel avec SQLWorkbenchJ .

13
Chris

Revenez à l'étape 4 du didacticiel que vous avez lié. Voir où il vous montre comment obtenir l'URL du cluster? Vous devez vous connecter à cette URL avec un pilote PostgreSQL. Les kits SDK AWS tels que Boto3 fournissent un accès à l'API AWS. Vous devez vous connecter à Redshift via une API PostgreSQL, tout comme vous vous connecteriez à une base de données PostgreSQL sur RDS.

8
Mark B

Bon, vous avez besoin de psycopg2 Python pour exécuter la commande COPY.

Mon code ressemble à ceci:

import psycopg2
#Amazon Redshift connect string 
conn_string = "dbname='***' port='5439' user='***' password='***' Host='mycluster.***.redshift.amazonaws.com'"  
#connect to Redshift (database should be open to the world)
con = psycopg2.connect(conn_string);
sql="""COPY %s FROM '%s' credentials 
      'aws_access_key_id=%s; aws_secret_access_key=%s'
       delimiter '%s' FORMAT CSV %s %s; commit;""" % 
      (to_table, fn, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY,delim,quote,gzip)

#Here
#  fn - s3://path_to__input_file.gz
#  gzip = 'gzip'

cur = con.cursor()
cur.execute(sql)
con.close() 

J'ai utilisé boto3/psycopg2 pour écrire CSV_Loader_For_Redshift

20
Alex B

Utilisation de psycopyg2 et get_cluster_credentials

Conditions préalables -

  • IAM ROLE attaché à l'utilisateur respectif

    Rôle IAM avec la politique get_cluster_credentials LIEN

  • Sur le cloud (EC2) avec le rôle IAM approprié attaché

Le code ci-dessous ne fonctionnera que si vous le déployez sur un PC/VM où les informations d'identification AWS d'un utilisateur sont déjà configurées [CLI - aws configure] OR vous êtes sur une instance du même compte, VPC .

  1. Avoir un fichier config.ini -

    [Redshift]
    
    port = 3389
    
    username = please_enter_username
    
    database_name = please_database-name
    
    cluster_id = please_enter_cluster_id_name
    
    url = please_enter_cluster_endpoint_url
    
    region = us-west-2
    
  2. My Redshift_connection.py

    import logging
    
    import psycopg2
    
    import boto3
    
    import ConfigParser
    
    
    def db_connection():
       logger = logging.getLogger(__name__)
    
       parser = ConfigParser.ConfigParser()
    
       parser.read('config.ini')
    
       RS_PORT = parser.get('Redshift','port')
    
       RS_USER = parser.get('Redshift','username')
    
       DATABASE = parser.get('Redshift','database_name')
    
       CLUSTER_ID = parser.get('Redshift','cluster_id')
    
       RS_Host = parser.get('Redshift','url')
    
       REGION_NAME = parser.get('Redshift','region')
    
       client = boto3.client('redshift',region_name=REGION_NAME)
    
       cluster_creds = client.get_cluster_credentials(DbUser=RS_USER,
                                                   DbName=DATABASE,
                                                   ClusterIdentifier=CLUSTER_ID,
                                                   AutoCreate=False)
    
    try:
      conn = psycopg2.connect(
        Host=RS_Host,
        port=RS_PORT,
        user=cluster_creds['DbUser'],
        password=cluster_creds['DbPassword'],
        database=DATABASE
      )
    
      return conn
    except psycopg2.Error:
      logger.exception('Failed to open database connection.')
      print "Failed"
    
  3. Script d'exécution de requête -

    from Redshift_Connection import db_connection
    
    def executescript(redshift_cursor):
        query = "SELECT * FROM <SCHEMA_NAME>.<TABLENAME>"
        cur=redshift_cursor
        cur.execute(query)
    

    conn = db_connection () conn.set_session (autocommit = False) cursor = conn.cursor () executescript (cursor) conn.close ()

0
Golokesh Patra