使用python和psycopg2将数据从S3复制到AWS redshift

Yan*_*lan 14 python psycopg2 amazon-redshift

我在执行copy命令时遇到问题,无法从S3将数据从S3加载到Amazon的Redshift.
我有以下复制命令:

copy moves from 's3://<my_bucket_name>/moves_data/2013-03-24/18/moves'
credentials 'aws_access_key_id=<key_id>;aws_secret_access_key=<key_secret>'
removequotes
delimiter ',';
Run Code Online (Sandbox Code Playgroud)

当我使用SQL Workbench/j执行此命令时,一切都按预期工作,但是当我尝试使用python和psycopg2执行此命令时,命令传递OK但没有加载数据且没有抛出错误.
尝试了以下两个选项(假设psycopg2连接正常,因为它是):

cursor.execute(copy_command)  
cursor.copy_expert(copy_command, sys.stdout)
Run Code Online (Sandbox Code Playgroud)

两者都没有发出警告,但未加载数据

想法?

谢谢

小智 27

我成功地使用了这个确切的设置(psycopg2 + redshift + COPY).你事后承诺了吗?SQL Workbench默认为自动提交,而psycopg2默认为打开事务,因此在您的连接上调用commit()之前,数据将不可见.

完整的工作流程是:

conn = psycopg2.connect(...)
cur = conn.cursor()
cur.execute("COPY...")
conn.commit()
Run Code Online (Sandbox Code Playgroud)

我不相信copy_expert()或任何cursor.copy_*命令可以与Redshift一起使用.


小智 14

首先,确保事务已提交.

conn = psycopg2.connect(conn_string)
cur = conn.cursor()
cur.execute(copy_cmd_str)
conn.commit()
Run Code Online (Sandbox Code Playgroud)

您可以通过以下方式确保事务提交(确保释放资源),

with psycopg2.connect(conn_string) as conn:
    with conn.cursor() as curs:
        curs.execute(copy_cmd_str)
Run Code Online (Sandbox Code Playgroud)

当连接退出with块时,如果块没有引发异常,则提交事务.如果发生异常,则回滚事务.

其次,当要加载的数据需要很长时间并超过connect_timeout(并且无法提交)时,即使执行提交也无济于事.因此,当显式提交没有帮助时,请尝试增加超时.


jer*_*tim 5

如果您使用 sqlalchemy,复制命令本身不会自动提交。这对我有用:

from sqlalchemy import create_engine
eng = create_engine(...)
command = """
copy command here
"""
conn = eng.connect()
result = conn.execution_options(autocommit=True).execute(command)
result.close()
Run Code Online (Sandbox Code Playgroud)


小智 -8

语法应该类似于DDL语句

# Create table
c.execute('''CREATE TABLE stocks
             (date text, trans text, symbol text, qty real, price real)''')
Run Code Online (Sandbox Code Playgroud)