web-dev-qa-db-ja.com

Python Boto3を介してAmazon Redshiftにデータをロードする方法?

Amazon Redshiftの Getting Started Guide では、データはAmazon S3からプルされ、SQLWorkbench/Jを使用してAmazon Redshiftクラスターにロードされます。 Boto を使用して、クラスターに接続し、クラスターにサンプルデータをロードする同じプロセスを模倣したいと思います。

ただし、Redshiftの Boto3のドキュメント では、Amazon Redshiftクラスターにデータをアップロードできる方法を見つけることができません。

次のコードでBoto3を利用してRedshiftに接続できました。

client = boto3.client('redshift')

しかし、 SQLWorkbenchJを使用したチュートリアル で行われる方法で、テーブルを作成したり、Amazon Redshiftにデータをアップロードしたりできる方法がわかりません。

13
Chris

リンクしたチュートリアルのステップ4に戻ります。クラスターのURLを取得する方法が示されている場所を参照してください。 PostgreSQLドライバーを使用してそのURLに接続する必要があります。 Boto3などのAWS SDKは、AWS APIへのアクセスを提供します。 RDS上のPostgreSQLデータベースに接続するのと同じように、PostgreSQL APIを介してRedshiftに接続する必要があります。

8
Mark B

そうですね、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 を記述しました

20
Alex B

Psycopyg2およびget_cluster_credentialsの使用

前提条件-

  • 各ユーザーにアタッチされたIAM ROLE

    Get_cluster_credentialsポリシーを備えたIAMロール [〜#〜] link [〜#〜]

  • 適切なIAMロールがアタッチされたオンクラウド(EC2)

以下のコードは、ユーザーのAWS認証情報がすでに構成されているPC/VMにデプロイする場合にのみ機能します[CLI-aws configure] OR同じアカウントのインスタンス、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()

0
Golokesh Patra