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 .
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.
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
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 .
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
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"
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 ()