Как загрузить данные в Amazon Redshift через Python Boto3?

В Руководстве по началу работы Amazon Redshift данные представлены извлечен из Amazon S3 и загружен в кластер Amazon Redshift с помощью SQLWorkbench / J. Я хотел бы имитировать тот же процесс подключения к кластеру и загрузки образцов данных в кластер, используя Boto3.

Однако в документации по Boto3 Redshift, Я не могу найти метод, который позволил бы мне загружать данные в кластер Amazon Redshift.

Мне удалось подключиться к Redshift с помощью Boto3 со следующим кодом:

client = boto3.client('redshift')

Но я не уверен, какой метод позволит мне создавать таблицы или загружать данные в Amazon Redshift, как это делается в учебник по SQLWorkbenchJ.


person Chris    schedule 24.01.2016    source источник


Ответы (3)


Вернитесь к шагу 4 в том руководстве, которое вы связали. Видите, где показано, как получить URL-адрес кластера? Вы должны подключиться к этому URL-адресу с помощью драйвера PostgreSQL. Пакеты SDK AWS, такие как Boto3, предоставляют доступ к API AWS. Вам необходимо подключиться к Redshift через PostgreSQL API, как если бы вы подключались к базе данных PostgreSQL на RDS.

person Mark B    schedule 25.01.2016
comment
Спасибо! Теперь я пытаюсь понять, как использовать SQLAlchemy вместо SQLWorkbenchJ, с которым у меня возникают некоторые трудности (я могу отредактировать этот вопрос или создать новый). - person Chris; 25.01.2016
comment
Если у вас есть новый вопрос, создайте новый вопрос. Пожалуйста, не редактируйте существующий вопрос, чтобы задать что-то новое. - person Mark B; 25.01.2016
comment
Используйте Aginity Workbench для Redshift для подключения к кластеру. Он имеет гораздо лучший пользовательский интерфейс и функции, и его также рекомендуют специалисты AWS. - person Paladin; 27.01.2016

Правильно, вам нужен psycopg2 модуль Python для выполнения команды COPY.

Мой код выглядит так:

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

Я использовал boto3 / psycopg2 для написания CSV_Loader_For_Redshift

person Alex B    schedule 29.03.2016

Использование psycopyg2 и get_cluster_credentials

Предпосылки -

Приведенный ниже код будет работать только в том случае, если вы развернете его на ПК / виртуальной машине, где учетные данные пользователя AWS уже настроены [CLI - aws configure] ИЛИ вы находитесь в экземпляре в той же учетной записи, VPC.

  1. Есть файл 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. Мой 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. Скрипт выполнения запроса -

     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()
    
person Golokesh Patra    schedule 30.07.2019