如何通过Python Boto3将数据加载到Amazon Redshift?

时间:2016-01-24 23:47:39

标签: python amazon-web-services amazon-s3 amazon-redshift boto3

在Amazon Redshift的Getting Started Guide中,数据从Amazon S3中提取并使用SQLWorkbench / J加载到Amazon Redshift群集中。我想模仿连接到群集的相同过程,并使用Boto3将样本数据加载到群集中。

但是在Redshift的Boto3's documentation中,我无法找到允许我将数据上传到Amazon Redshift群集的方法。

我已经能够使用Boto3使用以下代码与Redshift连接:

client = boto3.client('redshift')

但我不确定哪种方法可以让我按照tutorial with SQLWorkbenchJ的方式创建表格或将数据上传到Amazon Redshift。

3 个答案:

答案 0 :(得分:18)

是的,你需要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

答案 1 :(得分:7)

返回到您链接的教程中的第4步。看看它向您展示如何获取群集的URL?您必须使用PostgreSQL驱动程序连接到该URL。 AWS软件开发工具包(如Boto3)提供对AWS API的访问。您需要通过PostgreSQL API连接到Redshift,就像您将连接到RDS上的PostgreSQL数据库一样。

答案 2 :(得分:0)

使用psycopyg2和get_cluster_credentials

先决条件-

  • IAM角色已附加到相应用户

    具有get_cluster_credentials策略LINK

  • 的IAM角色
  • 在云(EC2)上具有适当的IAM角色

以下代码仅在将其部署在已经配置了用户的AWS凭证的PC / VM上后才有效[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() 执行脚本(光标) conn.close()